JVM运行时数据区域的划分如下图:
程序计数器(PC寄存器)是唯一没有规定OOM的数据区域。
运行时常量池位于方法区。
类的生命周期:
* 加载:查找并加载Class文件。
* 链接:
1.验证:确保被导入类型的正确性。
2.准备:为类的静态字段分配字段,并用默认值初始化这些字段。
3.解析:虚拟机将常量池内的符号引用替换为直接引用。
* 初始化:将类变量初始化为正确的初始值。
* 使用
* 卸载
垃圾标记算法:
* 引用计数算法:缺点是无法解决循环引用问题.
* 可达性分析算法(根搜索算法):以GC Roots为起点,向下搜索。需要注意哪些对象可以作为GC Roots.
垃圾回收算法:
* 标记-清除算法:会产生大量不连续的内存碎片
* 复制算法:将内存分为两个相等区域,每次只使用其中一个,GC时将存活对象复制到另一个区域中,然后清理当前区域。
* 标记-压缩法:经过垃圾标记后,将存活对象压缩到内存的一端,清理边界以外的内存。
* 分代收集算法:将内存分为新生代与老年代,对象先进入新生代,经过若干次GC后仍存活的对象慢慢晋入老年代,新生代采用复制算法,老年代采用标记-压缩算法。