Java GC机制和内存泄漏分析

Java 内存泄漏

190523,RSS给我推送了新的内容,扫了几眼对其中几篇文章挺感兴趣的,其中一篇出自掘金——纳尼,Java 存在内存泄泄泄泄泄泄漏吗?
,至此记录阅读心得吧。其次,还涉及以下几篇文章:

什么是内存泄漏

之所以感兴趣是以前没有具体的看过jvm内存泄漏(Memory Leak)的问题,不同于内存溢出(OOM),OOM是指程序申请内存空间但没有足够大的内存分配给它使用,Memory Leak是指程序申请内存空间后无法正确释放已申请的内存(具体一点就是不再使用的对象或变量一直占着内存空间)。虽然一两次内存泄漏问题不大,但长期积累内存也会被耗光,所以内存泄漏可能引起内存溢出

内存泄漏发生的情景

首先要明白为啥会发生内存泄漏,内存的分配由程序完成,内存的回收由GC自动完成。GC又是如何判断对象死亡可以被回收的?一种是引用计数法(存在相互引用的问题),另一种就是现在多被使用的可达性分析法。如图,由main进程为顶点开始的有向图,代表jvm内存的分配,第六行时o2由Obj2指向了Obj1,此时顶点到Obj2不可达,GC可以判断Obj2可回收。
可达性分析

图片引自:www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/1.gif

上面的例子再具体一点需要讲清什么是顶点和可达
可见《深入理解java虚拟机》,顶点就是指GC Roots对象,有四种对象属于GC Roots对象

  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 虚拟机栈中引用的对象
  • 本地方法栈中JNI[即一般说的Native]引用的对象

可达就是有从GC Roots对象到当前对象的引用链
所以内存泄漏专业点说就是不再被使用,但是仍就可达的对象

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值