第九周 性能优化 (三) 课后作业
请简述 JVM 垃圾回收原理。
1、辨别对象无效方法
主要引用计数法与可达性分析来标记无效对象。
2 垃圾回收方法
2.1 清除
把死亡对象占据的内存标记为空闲对象,并记录在一个空闲列表之中.要新建对象时,就把这些空间分配给新的对象.
缺点,会造成内存碎片.
2.2 压缩
把存活的对象聚集到内存区域的起始位置.
缺点,压缩算法的开销.
2.3 复制
把内存区域分成两份,分别用两个指针 from, to 来处理.当发生对象回收时,将存活的对象从 from 复制到 to 的区域,然后交换 from 和 to 的指针.
缺点,堆空间使用效率低下.
3 java 虚拟机的划分
java 虚拟机垃圾分代基于的基本假设-大部分对象只存活一小段时间,小部分对象存活很长时间.
新生代-老年代
新生代又分为 Eden 区和两个大小相同的 Survivor 区(from;to)
当调用 new 指令时,会在 Eden 划分出一块区域.当 Eden 区域内存满了,Java 此时会开始做 Young GC 也叫 Minor GC 收集新生代垃圾.
生存下来的对象会被送到 Survivor 区.
发生 Minor GC 时,Survivor 区的存活对象也会被从 from 移到 to 区.并交换 from 和 to 的指针.
Survivor 区的对象被来回复制超过 15 次以后,就会被送到老年代.
如果单个 Survivor 区的内存使用量超过 50%,较高复制次数的对象也会被晋升至老年代.
TLAB(Thread Local Allocation Buffer)-这个技术是用于解决多线程竞争堆内存分配问题的,核心原理是对分配一些连续的内存空间
如果老年代的对象引用了新生代的对象,那么这个引用也会被加入到 GC Roots 中.这会导致全堆扫描
如何应对全堆扫描-卡表,大致地标出可能存在老年代到新生代引用的内存区域
以下是来及回收的过程图:
版权声明: 本文为 InfoQ 作者【简简单单】的原创文章。
原文链接:【http://xie.infoq.cn/article/146b7e82e3a7e5e4e74bb14cf】。未经作者许可,禁止转载。
评论