JVM 参数

本文详细介绍了JVM的参数设置,包括堆分配、垃圾回收器、GC日志和堆快照等方面。讨论了如-Xmn、-XX:NewRatio、-XX:UseParallelGC、-XX:+UseG1GC等关键参数的作用和配置,以及如何通过-XX:+PrintGCDetails和-XX:+HeapDumpOnOutOfMemoryError等选项进行GC日志和堆信息的记录与分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JVM 参数(JDK8)

 

官方文档:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BGBCIEFC

 

-X :非标准选项

-XX:非稳定选项

 

在选项名前用 “+” 或 “-” 表示开启或关闭特定的选项,例:

    -XX:+UseCompressedOops:表示开启 压缩指针

    -XX:-UseCompressedOops:表示关闭 压缩指针

 

1.堆分配参数

-Xmn10M:设置新生代区域大小为10M

-XX:NewSize=2M:设置新生代初始大小为2M

-XX:MaxNewSize=2M:设置新生代最大值为2M

- - ##(如果以上三个同时设置了,谁在后面谁生效。生产环境使用-Xmn即可,避免抖动)

-Xms128M:设置java程序启动时堆内存128M(默认为物理内存1/64,且小于1G)

-Xmx256M:设置最大堆内存256M,超出后会出现 OutOfMemoryError(默认为物理内存1/64,且小于1G)

- - ##(生产环境 -Xms 与 -Xmx 最好一样,避免抖动)
-Xss1M:设置线程栈的大小 1M(默认1M)

- - ##  -XX:ThreadStackSize,-Xss 设置在后面,以-Xss为准;  -XX:ThreadStackSize设置在后面,主线程以 -Xss为准,其他线程以  -XX:ThreadStackSize为准

-XX:MinHeapFreeRatio=40:设置堆空间最小空闲比例(默认40)(当-Xmx与-Xms相等时,该配置无效)

-XX:MaxHeapFreeRatio=70:设置堆空间最大空闲比例(默认70)(当-Xmx与-Xms相等时,该配置无效)

-XX:NewRatio=2:设置年轻代与年老代的比例为2:1

-XX:SurvivorRatio=8:设置年轻代中eden区与survivor区的比例为8:1

-XX:MetaspaceSize=64M:设置元数据空间初始大小(取代-XX:PermSize)

-XX:MaxMetaspaceSize=128M:设置元数据空间最大值(取代之前-XX:MaxPermSize)

-XX:TargetSurvivorRatio=50:设置survivor区使用率。当survivor区达到50%时,将对象送入老年代

-XX:+UseTLAB:在年轻代空间中使用本地线程分配缓冲区(TLAB),默认开启

-XX:TLABSize=512k:设置TLAB大小为512k

-XX:+UseCompressedOops:使用压缩指针,默认开启

-XX:MaxTenuringThreshold=15:对象进入老年代的年龄(Parallel是15,CMS是6)

2.垃圾回收器相关

-XX:MaxGCPauseMillis:设置最大垃圾收集停顿时间(收集器工作时会调整其他参数大小,尽可能将停顿控制在指定时间内)

-XX:+UseAdaptiveSizePolicy:打开自适应GC策略(该摸式下,各项参数都会被自动调整)

 

-XX:+UseSerialGC:在年轻代和年老代使用串行回收器

 

-XX:+UseParallelGC:使用并行垃圾回收收集器,默认会同时启用 -XX:+UseParallelOldGC(默认使用该回收器)

-XX:+UseParallelOldGC:开启老年代使用并行垃圾收集器,默认会同时启用 -XX:+UseParallelGC

-XX:ParallelGCThreads=4:设置用于垃圾回收的线程数为4(默认与CPU数量相同)

 

-XX:+UseConcMarkSweepGC:使用CMS收集器(年老代)

-XX:CMSInitiatingOccupancyFraction=80:设置CMS收集器在年老代空间被使用多少后触发

-XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收

-XX:+UseCMSInitiatingOccupancyOnly:只在达到阈值的时候,才进行CMS回收

 

-XX:+UseG1GC:使用G1回收器

-XX:G1HeapRegionSize=16m:使用G1收集器时设置每个Region的大小(范围1M - 32M)

-XX:MaxGCPauseMillis=500 :设置最大暂停时间(毫秒)

 

-XX:+DisableExplicitGC:禁止显示GC的调用(即禁止开发者的 System.gc();)

 

2.GC日志

-XX:+PrintGCDetails:打印GC信息

-XX:+PrintGCTimeStamps :打印每次GC的时间戳(现在距离启动的时间长度)

-XX:+PrintGCDateStamps :打印GC日期

-XX:+PrintHeapAtGC:每次GC时,打印堆信息

-Xloggc:/usr/local/tomcat/logs/gc.$$.log :GC日志存放的位置

3.堆快照

-XX:+HeapDumpOnOutOfMemoryError:出现内存溢出时存储堆信息,配合 -XX:HeapDumpPath 使用

 

-XX:HeapDumpPath=/usr/local/tomcat/logs/oom.%t.log:堆快照存储位置

 

-XX:+UseLargePages:使用大页  

-XX:LargePageSizeInBytes=4m:指定大页的大小(必须为2的幂)

 

滚动日志记录
-XX:+UseGCLogFileRotation  : 开启滚动日志记录
-XX:NumberOfGCLogFiles=5 :滚动数量,命名为filename.0, filename.1 .....  filename.n-1,  然后再从filename.0 开始,并覆盖已经存在的文件
-XX:GCLogFileSize=8k  :  每个文件大小,当达到该指定大小时,会写入下一个文件
-Xloggc:/gc/log   :日志文件位置

 

 

### JVM 参数设置与调优指南 JVM(Java Virtual Machine)参数的合理配置对 Java 应用程序的性能和稳定性具有重要影响。以下是一些常见的 JVM 参数设置及其调优建议。 #### 堆内存设置 JVM 堆内存的大小可以通过 `-Xms` 和 `-Xmx` 参数进行配置。通常建议将这两个值设置为相等,以避免堆内存动态调整带来的性能开销。例如: ```bash -Xms512m -Xmx512m ``` 如果堆内存不足,JVM 会在 Full GC 后动态调整堆大小,这会消耗额外的资源并影响程序的稳定性 [^2]。 #### 年轻代与老年代配置 年轻代的大小可以通过 `-Xmn` 参数进行设置。年轻代的大小直接影响到垃圾回收的效率。例如: ```bash -Xmn128m ``` 此外,可以通过 `-XX:SurvivorRatio` 设置 Eden 区与 Survivor 区的比例。例如: ```bash -XX:SurvivorRatio=8 ``` 这表示 Eden 区与每个 Survivor 区的比例为 8:1:1。 #### 垃圾收集器选择 根据应用程序的需求,可以选择不同的垃圾收集器。以下是一些常用的垃圾收集器配置: - **并行收集器(Parallel Scavenge)**:适用于吞吐量优先的应用场景。 ```bash -XX:+UseParallelGC -XX:+UseParallelOldGC ``` - **CMS(Concurrent Mark Sweep)收集器**:适用于低延迟的应用场景。 ```bash -XX:+UseConcMarkSweepGC -XX:+UseParNewGC ``` - **G1(Garbage First)收集器**:适用于大堆内存管理,兼顾吞吐量和延迟。 ```bash -XX:+UseG1GC ``` #### 垃圾回收调优 - **最大暂停时间目标**:通过 `-XX:MaxGCPauseMillis` 设置每次年轻代垃圾回收的最大暂停时间。JVM 会根据此目标自动调整年轻代的大小。 ```bash -XX:MaxGCPauseMillis=50 ``` - **垃圾回收时间比例**:通过 `-XX:GCTimeRatio` 设置垃圾回收时间占程序运行时间的比例。例如,设置为 19 表示垃圾回收时间占 5%(1/(1+19))。 ```bash -XX:GCTimeRatio=19 ``` - **自动调整策略**:启用 `-XX:+UseAdaptiveSizePolicy` 后,并行收集器会自动调整年轻代大小和 Survivor 区比例,以达到目标系统规定的最低响应时间或收集频率。 ```bash -XX:+UseAdaptiveSizePolicy ``` #### 其他优化参数 - **Full GC 前调用 Young GC**:通过 `-XX:+ScavengeBeforeFullGC` 可以在 Full GC 前调用 Young GC,减少 Full GC 的工作量。 ```bash -XX:+ScavengeBeforeFullGC ``` - **线程数配置**:对于并行收集器,可以通过 `-XX:ParallelGCThreads` 设置并行收集的线程数,建议设置为与处理器核心数相等。 ```bash -XX:ParallelGCThreads=4 ``` #### 内存泄漏检测 在实际开发中,可以通过模拟内存泄漏来检测和调优 JVM。例如,以下代码模拟了一个内存泄漏的情况: ```java public class MemoryLeakDemo { static List<Byte[]> cache = new ArrayList<>(); public static void main(String[] args) { while (true) { cache.add(new Byte[1024 * 1024]); // 模拟内存泄漏 try { Thread.sleep(100); } catch (InterruptedException e) { } } } } ``` 此代码会不断向 `cache` 列表中添加新的 `Byte[]` 对象,导致内存占用不断增加,最终可能引发 OutOfMemoryError [^1]。 ### 相关问题 1. 如何选择适合的垃圾收集器? 2. 如何通过 JVM 参数优化应用程序的性能? 3. 如何检测和解决内存泄漏问题? 4. 如何配置 JVM 参数以减少 Full GC 的频率? 5. 什么是 G1 收集器,它与其他收集器有何不同?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值