会不会导致内存泄漏_Java内存泄漏!为什么会泄漏?如何泄漏?怎么定位?

JVM应该可以算Java中最为核心的部分了,其中开箱即用的内存管理又是JVM中的核心组成部分。我们都知道JVM的内存管理具有垃圾回收功能(Java Garbage Collector),编码时只需要new而无需主动的释放(类似于C++中的delete操作),所以Java中比较少出现内存泄露的情况。比较少出现,并不一定就不会出现,那么Java程序在什么时候会出现内存泄露呢?出现内存泄露该如何排查呢?

Java程序为什么会有内存泄露

什么是内存泄露呢?内存泄露可以定义为:当一个对象已经不再被应用程序使用以后,它所占用的内存没有得到及时的释放,导致内存使用量随着时间的推移不断的增加,最终导致应用程序崩溃的现象(Java中会在new新对象的时候抛出OutOfMemoryError)。

对于Java程序而言,当一个Object已经不会被程序所使用,但是它还被其它对象所引用,从而导致GC的时候无法被回收,从而导致内存泄露。

下图比较直观的展示了Java内存泄露发生的情形:

405a6e51d5f3af977175d5964762abc3.png

从上图我们可以把对象分为两大类:被引用的和不被引用的。垃圾回收的时候不释放那些不被引用的对象,被引用的对象则不会被释放,即便是这些对象后续一直都没有被用过。

定位Java内存泄露是比较麻烦的事情,需要使用到JVM提供的多种工具来进行内存分析,并且往往还需要结合代码进行分析。

Java堆内存泄露

首先我们来看看Java程序中最为常见的堆内存泄露。

如果想要直观的模拟出堆内存泄露,我们需要设置一一个较小的堆大小(内存泄露是独立存在的,和对内存大小无关,不过较小的堆内存大小可以更直观的观察到内存泄露)。

我们可以通过如下两个启动参数设置对内存大小:

a0717bba3575f06c741b521cd48ce50f.png

通过静态变量来演示内存泄露

首先我们通过如下的代码来看看看看正常Java代码运行时的内存变化情况:

15921095b4d5f74b152fc25192ce396d.png

启动参数:-Xms20m -Xmx20m

运行是的内存变化图:

38d590696e86148f0ab8cf565eb9768e.png

在我们的代码中我们每秒调用一次test方法,这个方法中会往list中添加数据,但是在方法返回之后这些数据就处于无引用状态了(并不一定会立马进行GC),我们每10秒调用一次System.gc()(full GC)。从内存监控图上能够直观的观察到堆内存的使用变化曲线。

接下来我们对上面的代码做一下修改:

静态变量保存了过多不在使用的对象引用导致的内存泄露是我们编码过程中最为常见的一种内存泄露方式。下面的代码就演示了这个情况:

ace07edebb13a23bd20b0ab322a22ff0.png

为了更加直观的观察内存变化,我稍微调整了一下每次插入的数据个数,启动参数仍旧和上面一下。这个时候我们能够得到如下图所示的内存变化曲线:

66538acc21f48b0d724cfad3e28b5de1.png

从曲线中我们可以发现,堆内存使用量一直在增加,并没有和前一个示例一样在full GC后释放没有使用的堆内存,每次调用test方法后添加到list中的对象都会被list所引用,所以GC是不会收集并释放这些内存的。

如何定位和解决内存泄漏

Java的内存泄漏定位一般是比较困难的,需要使用到很多的实践经验和调试技巧。下面是一些比较通用的方法:

  1. 可以添加-verbose:gc启动参数来输出Java程序的GC日志。通过分析这些日志,可以知道每次GC后内存是否有增加,如果在缓慢的增加的那,那就有可能是内存泄漏了(当然也需要结合当前的负载)。如果无法添加这个启动参数,也可以使用jstat来查看实时的gc日志。如果条件允许的话可以考虑使用jvisualvm图形化的观察,不过线上的话一般没这个条件。
  2. 当通过dump出堆内存,然后使用jvisualvm查看分析,一般能够分析出内存中大量存在的对象以及它的类型等。我们可以通过添加-XX:+HeapDumpOnOutOfMemoryError启动参数来自动保存发生OOM时的内存dump。
  3. 当确定出大对象,或者大量存在的实例类型以后,我们就需要去review代码,从实际的代码入手来定位到真正发生泄漏的代码。
06be3f926530f8b8113dd9df6b753a22.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

看了三张照片,这个AI只用20分钟破获六年“悬案”

摘要: 浙江实现首个AI破案:钱某某夫妇在衢州“国字号”水利风景区信安湖使用“电鱼”方式偷了六年鱼,但由于缺少证据始终无法定罪,然而最终没有逃过衢州城市大脑的AI神眼。 近日,浙江实现首个AI破案:钱某某…

c语言 异或_编程入门:C语言基础知识全网超全不用到处找了!(文末附清单)

你背或者不背,干货就在那里,不悲不喜你学或者不学,编程就在那里,不来不去听到这话的你是否略感扎心?01基础知识1. 计算机系统的主要技术指标与系统配置。2. 计算机系统、硬件、软件及其相互关系。3. 微机硬件系统的基本…

oracle中如何创建表的自增ID(通过序列)

1、什么是序列呢?序列是一数据库对象,利用它可生成唯一的整数。一般使用序列自动地生成主码值。一个序列的值是由特别的Oracle程序自动生成,因而序列避免了在运用层实现序列而引起的性能瓶颈。Oracle序列允许同时生成多个序列号,而…

反转!以视频搜视频,这批 AI 程序员要逆天了!

抖音AI火了!以图搜图,已经无法满足我们了。近期抖音新功能以视频搜视频上新,不知小姐姐叫什么,也能搜出她的影像!比如,你捕捉了一只可爱的妹子,想要看到更多她的影像,只要点一下“识…

阿里云消息队列Kafka商业化:支持消息无缝迁移到云上

摘要: 7月25日,阿里云宣布正式推出消息队列Kafka,全面融合开源生态。在兼容Apache生态的基础上,阿里云消息队列Kafka彻底解决了开源产品稳定性不足的痛点,可用性达99.9%,数据可靠性99.999999%,并…

excel三维地图数据源引用无效_Excel函数公式应用的基础,数据源的引用,动图解释...

一、数据源的相对引用公式的使用就是对数据源的引用,默认使用相对引用方式。采用这种方式引用的数据源,当将公式复制到其他位置时,公式中的单元格地址会随着变化。方法:1、选中C2单元格,在公式编辑栏中可以看到该单元格…

一份帮助你更好地理解深度学习的资源清单

摘要: 深度学习朝着可解释的方向发展,理解背后的基本原理显得更加重要。本文是一份帮助读者更好地理解深度学习基本过程的清单,便于初学者和部分起步者针对性地补充自己的知识体系。 人工智能和深度学习太火了,火得一塌糊涂&#…

python 按条件选择行和列数据_小白学数据结构-排序算法Python(冒泡、选择、快速、希尔等等)...

排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们通常所说的排序算法往往指的是内部排序算法,即数据记录在内…

【戳进来有福利】|【技巧帖】3个Tips提升云性能

戳蓝字“CSDN云计算”关注我们哦!作者 | David Linthicum转自 | InfoWorld翻译 | 孔子东游责编 | 阿秃当企业遭遇云计算性能瓶颈时,一般人能想到的而且是最简单的办法,就是针对那些表现不佳的工作负载来增加可用的资源数量。具体来说&#x…

目标检测技术演化:从R-CNN到Faster R-CNN

摘要: 一文了解目标检测技术发展,不要错过哟。 目标检测旨在准确地找到给定图片中物体的位置,并将其正确分类。准确地来讲,目标检测需要确定目标是什么以及对其定位。 然而,想要解决这个问题并不容易。因为&#xff…

关于解决jdbc版本错误问题

关于解决jdbc版本错误问题 最近在做一个项目,在使用IDEA测试某个接口时出现了这个异常: 然后百度了一下发现很多都说是mysql-connector-java.jar包版本不一样,或者是jdbc.properties文件内容出错。 一定要仔细检查自己的数据库名跟账户密码…

深度学习之优化详解:batch normalization

摘要: 一项优化神经网络的技术,点进来了解一下? 认识上图这些人吗?这些人把自己叫做“The Myth Busters”,为什么?在他们的启发下,我们才会在Paperspace做类似的事情。我们要解决是Batch Normal…

无法通过sak判断卡片类型_如何判断你家门能否更换智能锁?选锁门道你要懂!...

选择智能锁有三个门道,你不可不知。门道一:小心“特斯拉线圈”攻击去年在智能锁行业,最能刷屏的是“特斯拉线圈”事件,多个智能锁品牌被轻易入侵攻陷,让消费者关注智能锁的安全问题。行业人士建议消费者:将…

@程序员 天冷了,你准备抱键盘还是抱女朋友取暖?

01恭喜你已经过完了2019年所有的法定节假日有没有一点心寒但随之而来的冷空气更是肉体上的折磨真想说这个天气说好的春夏秋冬的呢为什么我只感受到了夏天和冬天骗子!02手里拿着抽纸随时准备擦去感冒导致的鼻涕不行,我要穿厚衣服打开我的衣橱咦&#xff1…

改变世界的七大NLP技术,你了解多少?(下)

摘要: 这里有改变世界的7大NLP技术,点进来了解一下吧! 改变世界的七大NLP技术,你了解多少?(上) 在第1部分中,我介绍了自然语言处理(NLP)领域以及为其提供支持…

windows如何生成ssh密钥

windows如何生成ssh密钥 1.安装git,先去git官网下载git,https://git-scm.com/downloads,直接点击windows下载就可以了。 2.下载完可以到桌面点击鼠标右键,可以看到多出两个东西git gui跟git bash 3.也可以点击你下载的文件所…

谈谈社区、产品和新Dubbo | 从Dubbo 的社区star 数突破 2 万说起

摘要: Dubbo近况,了解一下。 近期,阿里巴巴的高性能分布式服务框架 Dubbo,在 Github 上获得了超过 2万的 star 数,据了解这是截止目前国内第一家也是唯一一家超过2万 star 数的 Java 开源产品。 -无社区,不…

9008线刷_小米红米手机新机9008模式怎么进入?小米线刷救砖模式

说起了9008刷机,其实对于玩机党来说非常不模式,市面上大部分机型都是高通处理器而高通处理器一般都有9008模式。到底9008模式怎么进入呢?9008模式下我们又可以做哪些刷机操作呢?下面ROM乐园小编就带大家了解下红米和小米新机的900…

关于IDEA代码的整理以及函数

关于IDEA代码的整理以及函数 最近在写一个项目,发现有些代码比较冗长重复率较高,比如try{}catch(){}这个代码的重复率就比较高,我们可以把try、catch删除,然后用CttrlAltL来格式化,这样子比较美…

基于实战开发垂直搜索引擎_基于DDD的微服务设计和开发实战

作者:欧创新、邓頔、文艺你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案。本文是基于 DDD 的微服务设计和开发实战篇&#xff…