jvm的内存结构
线程共享:
- 堆:新生代(伊甸园、S1、S2)、老年代
- 元空间:主要存储常量、静态变量,jdk8以后放在内存中(解决OOM问题,同时避免触发FULL GC)
线程不共享:
- 本地方法栈、虚拟机栈、程序计数器
栈溢出原因:递归调用
堆溢出原因:创建了太多无法被回收的对象,或者发生大对象分配
垃圾回收
-
怎么判定对象已死?
引用计数法:无法解决互相引用的问题
可达性分析:虚拟机栈的引用、本地JNI方法引用、JVM需要的一些核心类、同步锁持有的对象、常量引用、静态属性引用 -
垃圾回收算法: 标记-清除、标记-复制(新生代)、标记-整理
-
垃圾回收器:
Serial:线程全停,单核处理
CMS:并发标记 Parallel GC:JDK8默认回收器,关注吞吐量
G1:分region,维护优先级表,按指定时间回收
ZGC:停顿时间非常短