java 内存泄露对象排查_Java内存泄漏排查-Go语言中文社区

Java内存泄漏排查

1.内存溢出和内存泄露

通俗点说:

内存溢出:申请了10个字节的空间,但是确在这个空间写入11或以上字节的数据,出现溢出。

内存泄漏:new申请了一块内存,后来很长时间都不再使用了(按理应该释放),但是因为一直被某个或某些实例所持有导致 GC 不能回收,也就是该被释放的对象没有释放。

1.1内存溢出(Out Of Memory)

产生该错误的原因主要包括:

JVM内存过小。

程序不严密,产生了过多的垃圾。

一般情况下,在程序上的体现为:

内存中加载的数据量过于庞大,如一次从数据库取出过多数据。

集合类中有对对象的引用,使用完后未清空,使得JVM不能回收。

代码中存在死循环或循环产生过多重复的对象实体。

1.2内存泄露(Memory Leak)

指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点:

这些对象是可达的,即在有向图中,存在通路可以与其相连。

这些对象是无用的,即程序以后不会再使用这些对象。

如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。

关于内存泄露的处理就是提高程序的健壮型,因为内存泄露是纯代码层面的问题。

1.3内存溢出和内存泄露的关系

内存泄露会最终会导致内存溢出。

相同点:都会导致应用程序运行出现问题,性能下降或挂起。

不同点:1) 内存泄露是导致内存溢出的原因之一,内存泄露积累起来将导致内存溢出。2) 内存泄露可以通过完善代码来避免,内存溢出可以通过调整配置来减少发生频率,但无法彻底避免。

2.确定频繁Full GC现象

虚拟机进程状况工具:jps(Java Virtual Machine Process Status Tool) 是 JDK 提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。

jps -l

288611115ed045c01162ca34c61f08b5.png

虚拟机统计信息监视工具:监视虚拟机各种运行状态信息:包括程序运行以来共发生YGC(Young GC)次数,耗时(s),发生FGC(Full GC)次数,耗时(s),总耗时GCT(GC Time)。

jstat -gcutil 进程名查询刷新时间(ms)

493bdc09f8d3cdc08d5abdb0985e3d1b.png

3.找出导致频繁Full GC的原因

1、线上排查:使用“Java内存影像工具:jmap”生成堆转储快照(一般称为headdump或dump文件),查看对象的存活情况(数量和大小),可以初步分析出到底是哪个对象出现了引用未被垃圾回收收集。

jmap -histo:live 进程名

773e4a04653dfbdd8e87f2925b0a497d.png

jmap -heap 进程名

2、离线分析:把堆dump下来再用MAT等工具进行分析,但dump堆要花较长的时间并且文件巨大,再从服务器上拖回本地导入工具。主要用到Histogram(展示各个类产生的实例,类似jmap -histo),Dominator Tree(展示大对象的占用率)。

jmap -dump:live,format=b,file=heap.dump-ip 进程名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值