JVM调优(二)JVM内存模型

JVM调优(二)JVM内存模型

JDK1.7堆内存模型

  • 年轻代

    • 主要存放new出来的新的小对象
    • 严格划分为三部分: Eden区以及两个大小一致的survivor区
    • 同一时刻只会有一个survivor区被使用, 另一个空闲
    • 当Eden区存满时, 触发GC将存活的对象移到空闲的survivor区
    • 根据JVM策略, 经过几次GC之后依然存活的对象将从survivor区移到老年代
  • 老年代

    • 主要存放生命周期较长的对象, 或者new出来的大对象
    • 当一个对象在年轻代被复制转移一定次数之后, 会被转移到老年代
    • 如果系统中使用了application级的缓存, 缓存中的对象往往会被转移到老年代
  • 永久代

    • 主要保存class,method,field对象
    • 一般不会溢出, 除非一次性加载了很多类
    • 涉及到热部署相关服务时, 可能会溢出, 原因是每次重新部署后, 类的class没有卸载, 导致大量class保存在永久代, 一般重启可以解决这类问题
  • virtual区

    • 最大堆内存和初始堆内存的差值

JDK1.8堆内存模型

  • 年轻代不变

  • 老年代不变

  • 取消永久代, 改为元空间

    • 元空间不占JVM内存, 直接使用本地物理内存
    • 元空间分为两部分
      • CCS: 如果设置启用压缩指针, 则此区域存在, 否则此区域不使用
      • CodeCache: 存放类文件等信息
  • 取消永久代的原因:

    • 永久代经常不够用或者发生内存泄露
    • 为了融合HotSpot JVM和JRockit VM, 而JRockit VM没有永久代