JVM内存分布
线程私有
程序计数器 记录当前线程所执行字节码的指示器
本地方法栈 为Native方法服务
jvm虚拟机栈 方法执行创建一个栈帧,栈帧的入栈和出栈
栈帧:
局部变量表 存放基本数据类型,对象引用地址,字节码指令地址
操作栈
动态链接
方法出口
虚拟机栈大小 栈帧*栈的深度
线程共有
方法区 存储已被虚拟机加载的类信息、常量、静态变量
Java堆 唯一目的就是存放对象实例-Xms -Xmx 新生代:老年代 = 1:2 –XX:NewRatio
新生代 -Xmn Eden:From Survivor:To Survivor = 8:1:1 (默认)–XX:SurvivorRatio
Eden空间
From Survivor空间
To Survivor空间
老年代
永久代 -XX:PermSize
GC回收
对象存活
引用计数算法 新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收 缺点无法解决循环调用
可达性分析 能找到GCroot引用则对象存活,否则死去
GCroot
虚拟机栈中引用的对象
方法区中类静态属性实体引用的对象
方法区中常量引用的对象
本地方法栈中JNI引用的对象
GC收集算法
标记-清除 标记出所有需要回收的对象,标记完成后统一回收 缺点空间碎片太多
复制算法
划分为大小相等的两块内存,每次只使用其中的一块当内存满了,复制到令一块里去
新生代就采用这种算法,小对象先在Eden,然后移动到From Survivor,
再利用复制算法将From Survivor清理到To Survivor,
如果To Survivor满了则移动到老年代里;大对象直接入老年代
标记-整理
标记存活对象,整理让所有存活的对象都向一端移动
老年代用此算法
分代收集算法 各个年代的特点采用最适当的收集算法 新生代复制算法 老年代标记整理算法
垃圾收集器
Serial收集器 串行
新生代、老年代使用串行回收;新生代复制算法、老年代标记-压缩;垃圾收集的过程中会Stop The World(服务暂停)
-XX:+UseSerialGC 串行收集器
ParNew收集器 新生代并行,老年代串行
ParNew收集器其实就是Serial收集器的多线程版本。新生代复制算法、老年代标记-整理
参数控制:-XX:+UseParNewGC ParNew收集器
-XX:ParallelGCThreads 限制线程数量
Parallel收集器 类似ParNew收集器,Parallel收集器更关注系统的吞吐量。可以通过参数来打开自适应调节策略
Parallel Old收集器 Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法
CMS收集器 CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器
CMS收集器是基于“标记-清除”算法实现的
G1收集器
空间整合,G1收集器采用标记整理算法
可预测停顿,这是G1的另一大优势
注:后续接着完善补充