JVM内存模型与垃圾回收

4 阅读1分钟

jvm的内存结构

线程共享:

  • 堆:新生代(伊甸园、S1、S2)、老年代
  • 元空间:主要存储常量、静态变量,jdk8以后放在内存中(解决OOM问题,同时避免触发FULL GC)

线程不共享:

  • 本地方法栈、虚拟机栈、程序计数器

栈溢出原因:递归调用
堆溢出原因:创建了太多无法被回收的对象,或者发生大对象分配

垃圾回收

  • 怎么判定对象已死?
    引用计数法:无法解决互相引用的问题
    可达性分析:虚拟机栈的引用、本地JNI方法引用、JVM需要的一些核心类、同步锁持有的对象、常量引用、静态属性引用

  • 垃圾回收算法: 标记-清除、标记-复制(新生代)、标记-整理

  • 垃圾回收器:
    Serial:线程全停,单核处理
    CMS:并发标记 Parallel GC:JDK8默认回收器,关注吞吐量
    G1:分region,维护优先级表,按指定时间回收
    ZGC:停顿时间非常短