JVM-相关内容
JVM内存模型
├── 线程私有区
│ ├── 程序计数器(记录当前线程正在执行的字节码指令地址)
│ ├── 虚拟机栈(存储局部变量表、操作数栈、动态链接和方法出口等信息)
│ └── 本地方法栈(服务于native方法)
└── 线程共享区
├── 堆(新生代、老年代)
└── 方法区(类信息、运行时常量池等)
java组成:
类信息、方法信息、运行时常量池
新生代、老年代
程序计数器:字节码指令地址
虚拟机栈:局部变量、方法出口等信息


以下是JDK 8中常用的JVM调优参数分类及说明:
一、堆内存参数
-
基础堆设置
-Xms:初始堆大小(如-Xms4g)12-Xmx:最大堆大小(建议与-Xms相同以避免动态扩容性能波动)23-Xmn:新生代大小(如-Xmn1g)38
-
分代比例
-XX:NewRatio:老年代与新生代比例(默认2:1)18-XX:SurvivorRatio:Eden区与Survivor区比例(默认8:1:1)18
二、元空间参数(替代永久代)
-XX:MetaspaceSize:初始元空间大小(如256m)23-XX:MaxMetaspaceSize:元空间上限(防止内存泄漏)28
三、垃圾回收器选择
-
常用回收器
-XX:+UseParallelGC:并行收集器(默认,适合高吞吐量)78-XX:+UseConcMarkSweepGC:CMS收集器(低延迟场景)48-XX:+UseG1GC:G1收集器(JDK 8u20+推荐)37
-
调优参数
-XX:MaxGCPauseMillis:目标最大GC停顿时间(如200ms)78-XX:ParallelGCThreads:并行GC线程数(默认与CPU核数相同)8
四、监控与日志
-XX:+PrintGCDetails:打印详细GC日志38-XX:+HeapDumpOnOutOfMemoryError:OOM时自动生成堆转储8-XX:HeapDumpPath:指定堆转储文件路径8
五、调优建议
- 堆内存:
-Xms和-Xmx设为相同值(如-Xms4g -Xmx4g)28 - 元空间:必须设置
MaxMetaspaceSize(如512m)23 - GC选择:高吞吐量选
ParallelGC,低延迟选CMS或G178
注:参数需结合应用场景(如Web服务/大数据处理)和硬件配置调整58。
元空间(Metaspace)是JDK 8引入的用于存储类元数据的内存区域,取代了原有的永久代(PermGen),其核心特点和机制如下:
一、基本定义
- 存储内容:存放类的元数据(如类信息、方法代码、常量池等)48
- 内存位置:使用本地内存(Native Memory)而非JVM堆内存56
二、与永久代的区别
-
动态扩展
- 永久代有固定大小(通过
-XX:PermSize设置),易引发OutOfMemoryError7 - 元空间默认无上限,按需动态分配本地内存78
- 永久代有固定大小(通过
-
垃圾回收机制
- 永久代GC效率低且易产生碎片7
- 元空间由JVM自动管理,触发Full GC时进行类卸载(回收未被引用的类加载器及元数据)18
三、关键参数
-XX:MetaspaceSize:初始容量阈值,达到后触发GC18-XX:MaxMetaspaceSize:限制最大容量(避免本地内存耗尽)17
四、优势总结
- 避免内存溢出:动态分配减少
PermGen space错误78 - 性能优化:降低内存碎片,提升类加载/卸载效率7
- 简化调优:无需手动设置永久代大小78
注:元空间的设计借鉴了JRockit等JVM的实现6。
Java元空间(Metaspace)是JVM用于存储类元数据的内存区域,主要存储以下内容25:
- 类元数据
- 类名、访问修饰符、父类信息、接口信息
- 字段信息(名称、类型、修饰符等)
- 方法信息(方法名、返回类型、参数列表等)
- 常量池
- 字符串常量
- 类和接口的全限定名
- 字段和方法的符号引用6
- 方法字节码
- 编译后的方法字节码
- 异常处理表
- 局部变量表5
- 其他运行时数据
- 静态变量(但静态变量值本身存储在堆中)
- 即时编译器(JIT)编译后的本地代码6
- 反射相关的元数据5
与永久代(PermGen)相比,元空间使用本地内存而非JVM堆内存,可以动态扩展且不易出现内存溢出48。在Java 8之后,类的元数据不再存储在永久代中,而是移到了元空间2。
设置jvm参数的时候还是需要设置元空间初始大小,避免不够的时候分配,影响性能 。-XX:MetaspaceSize
G1(Garbage-First)垃圾回收器通过统一的内存管理机制同时处理新生代和老年代,其核心机制和配置要点如下:
一、回收机制
-
内存划分
- 将堆划分为多个固定大小的Region(默认约2048个,每个1MB~32MB)67
- Region可动态分配为Eden、Survivor、Old或Humongous(大对象专用)区域78
-
回收模式
- Young GC
- 触发条件:Eden区占满时56
- 过程:存活对象复制到Survivor或晋升到Old区,采用复制算法68
- Mixed GC
- 触发条件:老年代占用超过IHOP阈值(默认45%)6
- 过程:选择性回收老年代Region(优先垃圾最多的Region),同时处理新生代24
- Young GC
-
并发处理
- 通过并发标记阶段减少STW时间,老年代回收与用户线程并发执行18
二、是否需要额外设置
-
基础启用
- 仅需添加JVM参数:
-XX:+UseG1GC(JDK9+默认启用)7
- 仅需添加JVM参数:
-
关键调优参数
- 停顿时间控制
-XX:MaxGCPauseMillis=200(目标停顿时间,默认200ms)18
- Region大小
-XX:G1HeapRegionSize=4m(需为2的幂次方)7
- 老年代回收阈值
-XX:InitiatingHeapOccupancyPercent=45(IHOP阈值,默认45%)6
- 并行线程数
-XX:ParallelGCThreads=N(根据CPU核心数调整)5
- 停顿时间控制
-
特殊场景配置
- 大对象处理:Humongous区默认自动管理,无需单独设置7
- 混合GC触发频率:通过
-XX:G1MixedGCCountTarget调整混合GC周期次数4
三、与传统收集器的区别
- 无需组合:单G1即可管理全堆,无需像CMS需搭配ParNew36
- 逻辑分代:物理上无连续分代空间,仅通过Region角色区分27
若需进一步优化,建议结合GC日志分析(-Xlog:gc*)调整参数15。

浙公网安备 33010602011771号