目录
运行时数据区域、JMM(JVM内存模型)
Minor GC、Full GC
|
Minor GC 新生代 |
Full GC/Major GC 老年代 |
-XX:+UseSerialGC |
串行GC |
串行GC |
-XX:+UseParallelGC |
PS GC |
并行MSC GC |
-XX:+UseConcMarkSweepGC |
ParNew GC |
并行GC 当出现concurrent Mode Failure时采用串行GC |
-XX:+UseParNewGC |
并行GC |
串行GC |
-XX:+UseParallelOldGC |
PS GC |
并行Compacting GC |
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC |
串行GC |
并发GC 当出现Concurrent Mode Failure或promotion failed时采用串行GC |
不支持的组合方式 |
1、-XX:+UseParNewGC -XX:+UseParallelOldGc 2、-XX:+UseParNewGC -XX:+UseSerialGC |
判断对象是否“存活”或“死亡”:
- 引用计数算法:
给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值加1;当引用失效时,计数器的值减;当该对象的计数器的值为0时,标志该对象失效。
- 跟搜索算法:
通过一系列的名为“GCRoots”的对象作为起始点,从这些节点开始向下搜索,搜索过的路径称为引用链,当一个对象到GCRoots没有任何引用链相连(用图论的话来说就是从GC Roots到这个对象不可达)时,则证明对象是不可用的。
各种回收算法
- 标记-清除算法
首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象
- 复制算法
将可用内存按容量划分为大小相等的两块,每次使用其中的一块,当一块的内存用完了,就将还存活的对象复制到另一块上面,然后再把已使用过的内存空间一次清空(Eden和Survivor)
- 标记-整理算法
标记过程仍然与标记-清除算法一样,让所以存活对象都向一端移动,然后直接清理掉边界意外的内容
- 分代收集算法
类加载,为何使用双亲委派模式?是否有场景可以打破这种模式?
类的生命周期:
类加载双亲委派模型
破坏双亲委派模型:线程上下文类加载器(Thread Context ClassLoader)
Finalize()方法
是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。
class TestGC{ |