面试后学习 -- Java GC机制

1. jvm怎么决定一个对象可以回收

①. 计数法
每个对象实例化的时候count 就加一, 删除对象引用的时候减一,这个方法的有点就是速度很快,但是这个方法有个问题。
比如:

class A{
B b;
}
class B{
A a;
}
A clazzA = new A();
B clazzB = new B();
clazzA.b=clazzB;
clazzB.a=clazzA;
//即使把clazzA 和clazzB都设置成null,他们的计数也不是0, 因为就不能被回收
clazzA=null;
clazzB=null;

②. Tracing
从gc root 对象开始查找引用,找到后继续查找当前引用的其他引用,如此循环就构成了一个图,没在图中的就是下次要回收的潜在对象。真正决定对象死亡需要2次标记。

GC root对象:

  • 虚拟机栈(栈帧中的本地变量表)中的引用的对象
  • 方法区的类静态属性引用的对象
  • 方法区的常量引用的对象
  • 本地方法栈中JNI的应用对象

2. GC 回收算法

①. Mark - Sweep
标记-清除算法,首先标记有reference的对象,没有标记的就是回收对象,需要清除。
缺点:效率问题, 空间问题(产生好多不联系的碎片)
②. Copying
把堆内存分成2分,每次gc, 把一块内存的存活的对象复制到另一块,然后清空这一块内存,这个可以利用的空间减少了一半。
③. Mark Compact
把标记存活的对象,放到内存开始的一端,然后清理边界外的对象
④. Generational gc
按对象的存活周期把内存分成几块,young generation, old generation, young generation 中把内存分成较大的Eden空间, 和2个较小的Survivor空间,新生产的对象放到Eden空间,当Eden 满了的时候,GC把存活的对象移动到第一个Survivor,并把Eden清空,第二次GC的时候把第一个Eden,Survivor空间的存活对象移动到第二个Surivivor空间, 并把其他清空,并把从第一个Survivor移动的对象的age加1, 下一次再把第二个Survivor空间的对象移动到第一个Survivor,如此循环,等age 到了一定值就会把对象移动到old generation.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供...
    简欲明心阅读 89,840评论 17 311
  • JVM架构 当一个程序启动之前,它的class会被类装载器装入方法区(Permanent区),执行引擎读取方法区的...
    cocohaifang阅读 1,699评论 0 7
  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 6,018评论 2 31
  • 来自: Android梦想特工队作者: Aaron主页: http://www.wxtlife.com/原...
    技术特工队阅读 4,404评论 0 28
  • 我总说要好好爱自己,享受生活,善待周围的一切,因为你不知道明天和意外哪一个会先来。 明天本来就满是意外,不是吗?很...
    眷恋一座城阅读 318评论 0 0