JVM-GC笔记(二)--- 对象如何回收
2016-07-25 22:59
162 查看
首先,目前主流的JVM实现中都采用了分代收集的算法,我们常常听到的新生代,老年代就是基于这个算法。
新生代:存放那些朝生夕死的对象
老年代:存放存活时间超过指定数值的对象
还有永久代,也就是方法区。存放了类结构,静态数据等,此区域JVM规范中并不要求回收。
1,标记-清除算法
原理:通过可达性分析标记无效对象,然后清除。
问题:产生大量内存碎片,碎片过多时,导致内存不够,提前触发GC
2,复制算法(适合新生代朝生夕死的特点)
原理:将堆分为两个区域A,B。分配对象时,在A区域分配,A不够分配时,将A中有效的对象转移到B中,然后清除A。接下来分配对象到B,B不够分配时,将有效对象转移到A中,如此反复。
问题:空间效率太低
解决:将堆分为一个eden区域,两个survivor区域。把eden和其中一个survivor看作原理中的A,另一个survivor看作B。转换时,把有效对象从eden和survivor中转移到另一个survivor中,然后在此survivor和eden中分配对象,如此反复。目前eden:survivor = 8:1
3,标记-整理算法
原理:同标记-清除算法类似,标记后,将可用的对象移动到一边,清除边界意外的其他对象。
新生代:存放那些朝生夕死的对象
老年代:存放存活时间超过指定数值的对象
还有永久代,也就是方法区。存放了类结构,静态数据等,此区域JVM规范中并不要求回收。
1,标记-清除算法
原理:通过可达性分析标记无效对象,然后清除。
问题:产生大量内存碎片,碎片过多时,导致内存不够,提前触发GC
2,复制算法(适合新生代朝生夕死的特点)
原理:将堆分为两个区域A,B。分配对象时,在A区域分配,A不够分配时,将A中有效的对象转移到B中,然后清除A。接下来分配对象到B,B不够分配时,将有效对象转移到A中,如此反复。
问题:空间效率太低
解决:将堆分为一个eden区域,两个survivor区域。把eden和其中一个survivor看作原理中的A,另一个survivor看作B。转换时,把有效对象从eden和survivor中转移到另一个survivor中,然后在此survivor和eden中分配对象,如此反复。目前eden:survivor = 8:1
3,标记-整理算法
原理:同标记-清除算法类似,标记后,将可用的对象移动到一边,清除边界意外的其他对象。
相关文章推荐
- jvm垃圾回收(GC)机制之如何判断对象已死
- java学习笔记15:垃圾回收机制(Garbage Collection)、垃圾回收原理和算法、通用的分代垃圾回收机制、JVM调优和Full GC、开发中容易造成内存泄露的操作
- JVM GC之一找出不可达对象并回收
- JVM如何判断哪些对象可以被回收
- JVM(3)对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制
- JVM (PART V)如何判断对象是否应该回收
- GC是如何判断一个对象为"垃圾"的?被GC判断为"垃圾"的对象一定会被回收吗?
- GC是如何判断一个对象为"垃圾"的?被GC判断为"垃圾"的对象一定会被回收吗?
- 【JVM】GC垃圾回收(一)——对象你死了没?
- JVM如何判断一个Java对象是否可以回收
- Java对象循环引用,Java gc 如何回收
- JVM GC回收策略 哪些对象可以被回收
- jvm垃圾回收机制(二)算法和如何进行判断对象是否回收实例
- Java虚拟机笔记(二):GC垃圾回收和对象的引用
- JVM如何判断一个对象是不是要被回收
- jvm中如何判定对象需要回收?
- 【java】jvm调优笔记(二)—— GC策略&内存申请、对象衰老
- JVM GC垃圾回收机制笔记
- 【JVM】GC垃圾回收(二)——对象:你才死了呢!
- jvm如何判断实例对象是否需要回收