JVM参数

JVM Options For GC
1: heap size
a: -Xmx
指定jvm的最大heap大小,如:-Xmx2g

b: -Xms
指定jvm的最小heap大小,如:-Xms1g

c: -Xmn
指定jvm中New Generation的大小,如:-Xmn256m

d: -XX:PermSize
指定jvm中Perm Generation的最小值,如:-XX:PermSize=32m

e: -XX:MaxPermSize
指定Perm Generation的最大值,如:-XX:MaxPermSize=64m

f: -Xss
指定线程桟大小,如:-Xss128k

g: -XX:NewRatio
指定jvm中Old Generation heap size与New Generation的比例,在使用CMS GC的情况下此参数失效, 如:-XX:NewRatio=2

h: -XX:SurvivorRatio
指定New Generation中Eden Space与一个Survivor Space的heap size比例,-XX:SurvivorRatio=8,那么在总共New Generation为10m的情况下,Eden Space为8m

i: -XX:MinHeapFreeRatio
指定jvm heap在使用率小于n的情况下,heap进行收缩,Xmx==Xms的情况下无效,如:-XX:MinHeapFreeRatio=30

j: -XX:MaxHeapFreeRatio
指定jvm heap在使用率大于n的情况下,heap进行扩张,Xmx==Xms的情况下无效,如:-XX:MaxHeapFreeRatio=70

k: -XX:LargePageSizeInBytes
指定Java heap的分页页面大小,如:-XX:LargePageSizeInBytes=128m

2: garbage collector
a: -XX:+UseParallelGC
指定在New Generation使用parallel collector,并行收集,同时启动多个垃圾回收thread,不能和CMS gc一起使用.系统吨吐量优先,但是会有较长长时间的app pause,后台系统任务可以使用此gc

b: -XX:ParallelGCThreads
指定parallel collection时启动的thread个数,默认是物理processor的个数,如:-xx:ParallelGCThreads=8

c: -XX:+UseParallelOldGC
指定在Old Generation使用parallel collector

d: -XX:+UseParNewGC
指定在New Generation使用parallel collector,是UseParallelGC的gc的升级版本,有更好的性能或者优点,可以和CMS gc一起使用

e: -XX:+CMSParallelRemarkEnabled
在使用UseParNewGC的情况下,尽量减少mark的时间

f: -XX:+UseConcMarkSweepGC
指定在Old Generation使用concurrent cmark sweep gc,gc thread和app thread并行,所以称作concurrent.app pause时间较短,适合交互性强的系统,如web server

g: -XX:+UseCMSCompactAtFullCollection
在使用concurrent gc的情况下,防止memory fragmention,对live object进行整理,使memory碎片减少

h: -XX:CMSInitiatingOccupancyFraction=n
指示在old generation在使用了n%的比例后,启动concurrent collector,默认值是68,如:-XX:CMSInitiatingOccupancyFraction=70
有个bug,在低版本的jvm上出现,http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6486089

i: -XX:+UseCMSInitiatingOccupancyOnly
指示只有在old generation在使用了初始化的比例后concurrent collector启动收集

3:others
a: -XX:MaxTenuringThreshold
指定一个object在经历了n次young gc后转移到old generation区,在linux64的java6下默认值是15,此参数对于throughput collector无效,如:-XX:MaxTenuringThreshold=31

b: -XX:+DisableExplicitGC
禁止java程序中的full gc,如System.gc()的调用

c: -XX:+UseFastAccessorMethods
原始类型get,set方法的优化

d: -XX:+PrintGCDetails
打应垃圾收集的情况如:
[GC 15610.466: [ParNew: 229689K->20221K(235968K), 0.0194460 secs] 1159829K->953935K(2070976K), 0.0196420 secs]

e: -XX:+PrintGCTimeStamps
打应垃圾收集的时间情况,如:
[Times: user=0.09 sys=0.00, real=0.02 secs]

f: -XX:+PrintGCApplicationStoppedTime
打应垃圾收集时,系统的停顿时间,如:
Total time for which application threads were stopped: 0.0225920 seconds

4: a web server product sample

JAVA_OPTS=" -server -Xmx2g -Xms2g -Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "

最初的时候我们用UseParallelGC和UseParallelOldGC,heap开了3G,NewRatio设成1.这样的配置下 young gc发生频率约10妙一次,full gc发生的频率极低.系统的使用率还是满高的,但是不论是young gc还是old gc,applicaton thread pause的时间比较长,不合适web应用.我们也调小New Generation的,但是这样会使full gc时间加长.
后来我们就用CMS gc,当时的总heap还是3g,新生代设置-Xmn1g,在这样的情况下young gc发生的频率变成,7,8妙一次,每次时间40~50毫秒之间,old gc很少发生,每次时间在1.2秒左右,最后我们调小总heap大小和New Generation,young gc 2,3秒发生一次,每次停顿时间在20毫秒之内,old gc很少发生,每次大约在0.5秒之内这样使系统比较平滑
在使用CMS gc的时候他有两种触发gc的方式:gc估算触发和heap占用触发. 我们的1.5.0.09环境下有次old区heap占用再30%左右,她就频繁gc,个人感觉系统估算触发这种方式不靠谱,还是用heap使用比率触发比较稳妥.
### 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、付费专栏及课程。

余额充值