JVM 区域划分

  • JVM 内存大小 = 堆 + 非堆
  • 组成
  • 堆由三部分组成, Eden(伊甸园), SurFrom and SurTo(幸存者), Ten(老年区). 注: Sur 0/1 和 Sur From/To 是一回事
  • 非堆由三部分组成, metaspace(元空间), codeCache, ClassSpace
  • 比例
  • 老年代 : 年轻代 = 2 :1
  • eden:surFrom:surTo = 8:1:1
  • 文档中常见 方法区, 持久带, 这两个是等价的, 并且已经在 jdk8 中移除, 由 metaspace 替代

JVM 入门_java


JVM 内存及GC介绍

内存介绍

  • 创建的对象会优先进入 Eden, 除以下情况
  • 设置 MaxTenuringThreshold 为 0
  • 如果在新生代分配失败且对象是一个不含任何对象引用的大数组,可被直接分配到老年代
  • 当 Eden 空间不足时, 进行一次 YGC, 未被回收的对象进入 Sur
  • 经过一次 YGC, Sur 中的对象年龄会+1
  • 一般情况下年龄为 15 会进入老年区
  • 特殊情况, 当同年龄的对象总大小超过 sur 的空间一半, 也会从 sur 进入 old
  • 当 old 区域不足时, 进行一次 FGC

GC

  • YGC: 当 eden 大小不够时, 进行 YGC
  • FGC: 当 老年区 大小不够时, 进行 FGC

图示


参数

分类

  • 标准参数
  • X参数, 使用 java -x 检索, 非标参数
  • XX参数, 调试参数
  • 所有的XX参数都以”-XX:”开始, 但是随后的语法不同, 取决于参数的类型
  • 对于布尔类型的参数, 我们有+和-, 然后才设置JVM选项的实际名称. 例如, -XX:+用于激活选项, 而-XX:-用于注销
  • 对于需要非布尔值的参数, 如string或者integer, 我们先写参数的名称, 后面加上=后赋值. 例如, -XX:=给赋值

示例

// 堆
-Xms // 堆的初始大小, 默认情况下是物理内存的 1/64, 等价于 -XX:InitialHeapSize
-Xmx // 堆的最大大小, 默认情况是物理内存的 1/4, 等价于 -XX:MaxHeapSize
 
-XX:NewSize // 新生代初始大小, 是堆的一部分, 此时老年代就是 Xmx-该数值, 一般不允许新生代比老年代还大
-XX:MaxNewSize // 新生代最大大小
 
-XX:SurvivorRatio // 指定 eden 和 sur 的大小比例, 默认为 8, 即 8:1:1
-XX:NewRatio // 设置老生代和新生代的比例, 默认为 2, 即新生代:老生代=1:2
 
// 晋升老年代
-XX:InitialTenuringThreshold // 初始对象晋升老年代的阈值, 默认为 7
-XX:MaxTenuringThreshold // 晋升老年代的年龄阈值, 默认 15, 超过这个直接进入老年代
-XX:-UseAdaptiveSizePolicy // 若关闭动态计算规则, 则恒定以 MaxTenuringThreshold 为晋升规则
-XX:TargetSurvivorRatio // 设置幸存区的目标使用率, 默认 50, 即 50%
 
// 元空间(非堆)
-XX:MetaspaceSize // 元空间触发 gc 阈值
-XX:MaxMetaspaceSize // 元空间最大值
 
MinMetaspaceFreeRatio // 默认 40, 即 40%, 空闲比例小于这个参数, 则会扩大 metaspace
MaxMetasaceFreeRatio // 默认 70, 即 70%, gc 后, 空闲比例大于这个参数, 则会缩小 metaspace
MaxMetaspaceExpansion // 增长的最大幅度, 默认约 5M
MinMetaspaceExpansion // 增长的最小幅度, 默认约 300K
 
// 堆外
-XX:MaxDirectMemerySize // 对外内存限制
-XX:-DisableExplicitGC // 取消 禁用System.gc()
 
// gc log
-XX:+PrintGC // 简单 gc log
-XX:+PrintGCDetails // 信息 gc log
 
-XX:+PrintGCTimeStamps // 添加时间戳, 自 java 启动开始
-XX:+PrintGCDateStamps // 添加日期和时间
 
UseParNewGC // 并行进行 YGC, 单核效果不大
// oom dump
-XX:+HeapDumpOnOutOfMemoryError // oom 自动生成 dump 文件
-XX:HeapDumpPath=<path> // 生成 dump 文件路径
-XX:OnOutOfMemoryError=<cmd> // oom 执行一条命令
 
// 其他
-XX:+PrintTenuringDistribution // 设置每次新生代GC后输出幸存者乐园中对象年龄的分布
-XX:+UnlockDiagnosticVMOptions
-XX:+PrintNMTStatistics