主要学习了《深入理解Java虚拟机:JVM高级特性与最佳实践》的第三章
本文简直就是读书笔记,求作者不要撕我
程序计数器(PC)、虚拟机栈(java)、本地方法栈(native)
线程私有,内存分配和回收具备确定性
e.g.栈帧Stack Frame进入和退出有条不紊,类结构确定下来时就已知内存
Java堆、方法区(逻辑堆)
线程共享,内存多样,运行时才可知
分配和回收是动态的,垃圾回收器关注的是这部分内存
1.对象已死吗
(原文标题不错就不改了)
1)引用计数算法Reference Counting
顾名思义,ref即为生命(被引用+1,失效-1)
简单,高效,but难以解决对象间相互引用的问题「死锁Dead Lock」
2)可达性分析算法Reachability Analysis
「路由Routing」「图论」「树」
GC Root(根),引用链Reference Chain(茎)
通过父节点指针上查,根不可达则out
3)强软弱虚引用
如何描述一些“食之无味,弃之可惜”的对象
强:Object obj = new Object(),never被回收
软:内存溢出异常前触发救场,in danger被回收
弱:生存到next time垃圾回收
虚:回收时,收到系统通知(较无关)
*4)不可达缓刑
「e.g.死亡时间Dead Time」
finalize() – 然而设计的并不好
*5)回收方法区
2.垃圾收集算法
1)标记-清楚算法Mark-Sweep
标记=前述「对象已死吗」判定
效率不高,内存碎片
2)复制算法Coping
大小等块,50%”浪费”
98%新生代朝生夕死,HotSpot Eden 8 : Survivor 1
每次使用Eden和一块Survivor(90%),将其中还存活着的复制到另外一块Survivor上(10%,”浪费”)
「分配担保Handle Promotion」
若另一块Survivor空间不够时,则通过分配担保(借钱)机制直接进入老年代
猴子也能懂:侥幸生还,不够借钱
3)标记整理算法Mark-Compact
顾名思义,存活的对象向一端移动并堆叠,清理掉边界以外的
4)分代收集算法Generational Collection
「分类讨论」
新生代Coping
老年代Mark-Sweep、Mark-compact