内存划分:程序计数器(恢复先),虚拟机栈(动态链接,方法出口),本地方法栈(Native方法)=随线程而生,随线程而灭。直接内存。
方法区(类,常量,静态变量,编译后代码8),堆(对象实例,老)。
-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=../logs.dump.
对象已死:标记两次。1.应用计数算法,+1-1,无法解决循环引用。
2.可达性分析,没有任何引用链可以到GC roots(虚拟机栈对象、方法区静态属性引用对象、方法区常量引用对象,native方法引用对象)
分析:强引用(New不),软(溢出前),弱(一直),虚(通知)
垃圾收集算法:分带:1.标记-清除(效率低,碎片多,无法存大对象)2.复制算法(新8:1:1,不够分配担保)3.标记-整理(老)
收集器:新:1.Serial 复制,单线程,stop 2.ParNew 复制 多线程 配CMS 3.ParallelScavenge 复制 多线程 可控制吞吐量
老:4. Serial Old 标记-整理5.Parallel Old 标记-整理,其他同新。
6.CMS:最短停顿时间。标记-清除。初始、并发、重新标记,并发清除,短暂停顿,总体并发。缺点:吃CPU,浮动垃圾,大碎片。
7. G1 1.7特有,并行,分带,空间整合(总体整理,局部复制),可预测停顿(智能学习,优先列表)。
注意:1大对象直接进入老年代2长期存活的对象进入老年代15
3.动态对象年龄判定。4空间分配担保