《深入理解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空间。回收时,将Eden和Survivor中还存活的对象拷贝至另外一块Survivor空间中,最后清理将Eden和刚才使用过的Survivor空间。当Survivor空间不够时,需要依赖老年代空间进行担保。 HotSpot虚拟机默认的Eden和Survivor大小比为8:1。
3. 标记-整理算法
过程与“标记-清除”算法一样,后续步骤不是直接对可回收对象进行清理,而是让所有活动对象向一端移动,然后直接清理掉端边界以外的内存。
五、垃圾回收器
1.Serial收集器
最基本、最悠久的收集器。单线程,垃圾回收时,必须暂停所有其它线程,直到收集结束。可以与CMS收集器配合工作。
1. ParNew收集器
Serial收集器的多线程版本。在单线程环境中,效率并不比Serial高。
可以与CMS收集器配合工作,不能与Parallel Scavenge配合工作。
2. Parallel Scavenge收集器
新生代收集器,使用复制算法,并行的多线程收集器。
目的是达到一个可控制的吞吐量,吞吐量是CPU用于运行用户代码时间与CPU总消耗时间的比值。
提供了两个参数用于控制吞吐量:
-XX:MaxGCPauseMills 控制最大垃圾收集停顿时间,值为大于零的毫秒数。
-XX:GCTimeRatio 直接设置吞吐量大小,值为垃圾回收时间占总时间的比率的倒数。默认为99
4.Serial Old收集器
Serial收集器的老年代版本,单线程收集器,使用“标记-整理”算法。
可以与Parallel Scavenge收集器配合使用,可以作为CMS收集器的后备预案。
5.Parallel Old收集器
Parallel Scavenge收集器的老年代版本,多线程,使用“标记-整理”算法。
1.6才开发提供,提供原因:新生代采用Parallel Scavenge收集器,老年代除了Serial Old外别无选择。
6.CMS收集器(Concurrent Mark Sweep)
以获取最短回收停顿时间为目标的收集器,采用“标记-清除”算法。
分为四个步骤:初始标记、并发标记、重新标记、并发清除
缺点:由于有“浮动垃圾”,需要预留足够的空间提供并发收集时的线程使用,不能像其它收集器那样等老年代几乎全部被填满了再去收集。
7.G1收集器
技术最前沿的收集器。采用“标记-整理”算法。
将整个Java堆划分成若干个大小固定的独立区域,根据允许的回收时间,优先回收垃圾最多的区域。
名词:
Minor GC:新生代垃圾回收
Major GC/Full GC:老年代GC
- 深入理解java虚拟机学习笔记(二)
- 《深入理解Java虚拟机》学习笔记(二)
- 《深入理解java虚拟机》学习笔记二/双亲委派模型
- 《深入理解JAVA虚拟机》学习笔记(二)JAVA垃圾收集之对象存活判定算法
- 《深入理解java虚拟机》学习笔记10——并发编程(二)
- 《深入理解java虚拟机》学习笔记10——并发编程(二)
- 深入理解java虚拟机学习笔记(一、走近java)
- 《深入理解Java虚拟机》学习笔记
- 《深入理解java虚拟机》学习笔记一
- 深入理解Java虚拟机-学习笔记
- 《深入理解Java虚拟机》学习笔记
- 《深入理解 Java 虚拟机》学习笔记2
- 《深入理解java虚拟机》学习笔记
- 深入理解java虚拟机-学习笔记01
- 《深入理解Java虚拟机》学习笔记
- 深入理解java虚拟机-学习笔记
- 《深入理解java虚拟机》学习笔记03
- 深入理解Java虚拟机学习笔记1
- 不能忘记了:windows下配置mysq环境变量
- 自考之叹
- 中南大学2012年7月月赛Problem G: Number Transformation
- c陷阱和缺陷学习笔记
- JDOM输出XML字符串的属性
- 《深入理解Java虚拟机》学习笔记(二)
- “马太效应”与“二八法则”
- XML使用细项
- 理解android中的handler
- HTTP协议百科
- ListView 分页加载
- 很短很感人的爱情故事:经典伤感QQ日志
- HA高可用HEARTBEAT配置
- Apache2.2 + tomcat5.5 集群以及负载均衡配置测试