《深入理解Java虚拟机》学习笔记(二)

来源:互联网 发布:cf防沉迷解除软件 编辑:程序博客网 时间:2024/05/17 22:50

三、如何判断对象已死?

1.  引用计数法

给对象添加一个引用计数器,当有reference指向它时,引用计数器加1,当reference失效时,引用计数器减1,引用计数器为0的对象是不可再用的。

JVM中没有选用引用计数法,原因是很难解决对象循环引用问题。

2.根搜索算法

通过一系列“GC Roots”的对象作为起点,从这些起点开始往下搜索,搜索所经过的路径称为引用链(Reference Chain),当一个对象到“GC Roots”没有任何引用链时,那么该对象是不可用的。

Java语言里,可用为“GC Roots”的对象有以下几种:

虚拟机栈中的引用对象;

方法区中的类静态成员引用对象;

方法区中的常用引用对象;

本地方法栈中的引用对象;

 

判断方法区中的类是否是无用的类:

A. 该类所有的实例都已被回收;

B. 加载该类的ClassLoader已被回收;

C. 该类对应的java.land.Class对象没有任何地方被引用;

3.生存还是死亡?

在根搜索算法中的不可达对象,并非“非死不可”,只能说它们暂时处于“缓刑”状态。要宣告一个对象死亡,需要两次标记过程:如果对象在进行根搜索后发现没有与“GC Roots”相连接的引用链,那它将被标记并进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当finalize()方法没有被覆盖,或者 finalize()方法已被执行过,则该finalize()都视为没有必要执行。Finalize()方法是对象脱离死亡命运的最后一次机会。如果对象要在finalize()中成功拯救自己与引用链上的一个引用建立关联即可,第二次标记时它会被移出“即将回收”的范围;如果对象这个时候还没逃脱,它就离死不远了。

注意:一个对象的finalize()方法只会被调用一次。

 

 

四、垃圾回收算法

1.       标记-清除法

首先标记出所有需要回收的对象,在标记完成后统一回收被标记的对象。

缺点:效率低;标记清除后会产生大量不连续的碎片。

2.       复制算法

将可用内存划分为大小相等的两块,每次只使用其中一块。当这块用完了,将活着的对象复制到另一块内存上面,将原来内存一次性清掉。

优点:不用考虑内存碎片问题;

缺点:将内存缩小为原来的一半

优化方法:将内存划分为较大的Eden空间和两块较小的Survivor空间。回收时,将EdenSurvivor中还存活的对象拷贝至另外一块Survivor空间中,最后清理将Eden和刚才使用过的Survivor空间。当Survivor空间不够时,需要依赖老年代空间进行担保。 HotSpot虚拟机默认的EdenSurvivor大小比为8:1

3.       标记-整理算法

过程与“标记-清除”算法一样,后续步骤不是直接对可回收对象进行清理,而是让所有活动对象向一端移动,然后直接清理掉端边界以外的内存。

 

五、垃圾回收器

1Serial收集器

最基本、最悠久的收集器。单线程,垃圾回收时,必须暂停所有其它线程,直到收集结束。可以与CMS收集器配合工作。

1.  ParNew收集器

Serial收集器的多线程版本。在单线程环境中,效率并不比Serial高。

可以与CMS收集器配合工作,不能与Parallel Scavenge配合工作。

2.  Parallel Scavenge收集器

新生代收集器,使用复制算法,并行的多线程收集器。

目的是达到一个可控制的吞吐量,吞吐量是CPU用于运行用户代码时间与CPU总消耗时间的比值。

提供了两个参数用于控制吞吐量:

-XX:MaxGCPauseMills 控制最大垃圾收集停顿时间,值为大于零的毫秒数。

-XX:GCTimeRatio 直接设置吞吐量大小,值为垃圾回收时间占总时间的比率的倒数。默认为99

4Serial Old收集器

Serial收集器的老年代版本,单线程收集器,使用“标记-整理”算法。

可以与Parallel Scavenge收集器配合使用,可以作为CMS收集器的后备预案。

5Parallel Old收集器

Parallel Scavenge收集器的老年代版本,多线程,使用“标记-整理”算法。

16才开发提供,提供原因:新生代采用Parallel Scavenge收集器,老年代除了Serial Old外别无选择。

6CMS收集器(Concurrent Mark Sweep)

以获取最短回收停顿时间为目标的收集器,采用“标记-清除”算法。

分为四个步骤:初始标记、并发标记、重新标记、并发清除

缺点:由于有“浮动垃圾”,需要预留足够的空间提供并发收集时的线程使用,不能像其它收集器那样等老年代几乎全部被填满了再去收集。

7G1收集器

技术最前沿的收集器。采用“标记-整理”算法。

将整个Java堆划分成若干个大小固定的独立区域,根据允许的回收时间,优先回收垃圾最多的区域。

 

名词:

Minor GC:新生代垃圾回收

Major GC/Full GC:老年代GC

原创粉丝点击