jvm内存模型
虚拟机栈(通常所说的栈):存储局部变量表等
本地方法栈:给Native方法使用的
堆:存储实例对象
方法区:堆中,存储类信息、常量、静态变量
常量池:方法区中,1.8后移到堆中
直接内存:堆外内存,使用系统内存,例如nio
程序计数器:线程私有,指向指令执行到哪了
ps:线程独有的 栈和程序计数器
jvm垃圾回收机制
分代回收机制:新生代(一个Eden区+两个Survivor区)和老年代
-Xmn10M代表给新生代分配10M内存
-XX:SurvivorRatio=8代表配置一个Eden区和其中一个Survivor区的比例为8:1
内存分配:
(1)一个新增的对象实例首先会分配在Eden区,若Eden区内存不够了将触发一次Minor GC,Minor GC后存活下来的对象Survivor区存不下会通过分配担保机制直接转移至老年代
(2)经过了15次(默认)Minor GC后依然存活的Survivor区对象会晋升至老年代中,-XX:MaxTenuringThreshold=15控制,另一种说法是Survivor区中同龄的对象大小总和大于Survivor区空间的一半,大于等于该年龄的对象会晋升至老年代
(3)可通过参数-XX:PretenureSizeThreshold=75547562设置大于多少M的对象实例直接分配在老年代
回收策略:
新生代采用复制算法(Minor GC时将Eden区和其中一个Survivor区中还存活的对象复制到另一个空闲的Survivor区,可回收的对象空间清理干净,这样来回反复)
老年代采用标记-整理算法(标记-清除算法的升级版,对于存活下来的对象从一端按序排放)
补充:分配担保策略(Minor GC之前会检查老年代剩余连续可用空间是否大于新生代对象总大小/历届晋升过来的平均容量大小,如果是才可以进行Minor GC否则进行Full GC)