第一部分 运行时数据内存
程序计数器:改变程序计数器的值,可以选取下一条字节码指令。程序计数器 支持 程序控制流的指示器,分支,循环,跳转,异常处理,线程恢复等基础操作(线程私有)
Java堆:所以对象实例和数组内存分配的地方(线程共享)
Java虚拟机栈:一般是指局部变量表部分,有基本数据类型,对象引用(线程私有)
本地方法栈:有Java虚拟机栈一样,但是本地方法栈是为了本地方法使用的(线程私有)
方法区:用于存储已被虚拟机加载的类型信息,常量,静态变量,即时编译后的代码缓存等数据(线程共享)
第二部分 对象
对象的创建:分配内存方式 1.指针碰撞 2 空闲列表
对象的组成:1.对象头 2.实例数据 3填充数据
对象的定位:1.句柄 2.指针
第三部分 判断对象是否死亡
可达性分析算法:从GC root 根对象啊为节点集,开始搜索对象,搜索的路径形成“引用连” ,若对象在该链上,则说明对象还可以使用,若不在,则对象不能使用
引用计数算法:在对象中设置一个应用计数器,每当被引用就加一,若引用失效,则将减一,若数据为0时,说明该对象失效。
第四部分 垃圾收集算法
分代收集理论:1.弱分代理论:大多数对象就是朝生夕灭 2.强分代理论:当对象可以经过多次垃圾收集都没有消亡就难以消亡。
标记-清除算法:首先标记要清除的对象,然后第一步完成之后,进行清除操作。缺点:1.会产生碎片空间 2.当数据庞大时,效率变低。
标记-复制算法:把内存分为大小均等俩部分,每次只使用其中一块内存,当其中这一块内存使用完,把活着对象复制到另一块,然后把使用过后内存清空。缺点:内存变小,效率变低
标记-整理算法:首先和标记-清理算法的标记阶段一样,然后把存活的对象移动到一端,然后以存活的对象为边界,把未存活的对象进行清除。
第五部分 垃圾收集器
新生代
serial收集器:单线程,当使用该收集器时,就得停掉其他用户线程。
ParNew收集器:实际时多线程版本的serial收集器。
Parallel Scavenge收集器:采用标记-复制算法,可以并行的多线程收集器。
老年代
CMS收集器:采用的标记-清除算法,该收集器一种获取最短回收停顿时间为目标的收集器。
Serial Old收集器:单线程,使用标记-整理算法,作用:一 在JDK5之前与Parallel Scavenge搭配,二作为CMS失败的替补方案。
Parallel Old收集器:基于标记-整理算法,是一个并发多线程收集器,他注重吞吐量或者处理器资源较为稀缺的场合。
新生-老年代
G1收集器:它是一款面向服务器端应用的垃圾回收器,它的设计思路是采用基于Region的内存布局形式。