JVM 深入浅出 - [JVM优化配置]

一、JVM基础参数配置

-Xms            初始堆大小[默认物理内存的1/64]
-Xmx            最大堆大小[默认物理内存的1/4] 
-Xmn            年轻代大小(1.4or lator)
-XX:NewSize     设置年轻代大小(for 1.3/1.4)    
-XX:MaxNewSize  年轻代最大值(for 1.3/1.4)    
-XX:PermSize    设置持久代(perm gen)初始值[默认物理内存的1/64]  
-XX:MaxPermSize 设置持久代最大值[默认物理内存的1/4]  
-Xss            每个线程的堆栈大小[JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K]
-XX:ThreadStackSize         线程堆栈大小(0表示使用默认堆栈大小)
-XX:NewRatio                年轻代与年老代的比值  -XX:NewRatio=4表示年轻代与年老代所占比值为1:4设置了Xmn的情况下,该参数不需要进行设置。
-XX:SurvivorRatio           Eden区与Survivor区的大小比值[默认8 8:1:1]
-XX:LargePageSizeInBytes    内存页的大小不可设置过大, 会影响Perm的大小=128m
-XX:+UseFastAccessorMethods 原始类型的快速优化    
-XX:+DisableExplicitGC      关闭System.gc()
-XX:MaxTenuringThreshold    垃圾最大年龄[默认15]如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代. 
-XX:+AggressiveOpts         加快编译    
-XX:+UseBiasedLocking       锁机制的性能改善    
-Xnoclassgc                 禁用垃圾回收    
-XX:SoftRefLRUPolicyMSPerMB 每兆堆空闲空间中SoftReference的存活时间[默认1s]
-XX:PretenureSizeThreshold  对象超过多大是直接在旧生代分配
-XX:TLABWasteTargetPercent  TLAB占eden区的百分比[默认1% ]   
-XX:+CollectGen0First       FullGC时是否先YGC[默认false]   

二、垃圾回收器的选取

2.1 单核测试环境

‐XX:+UseSerialGC        开启 Serial 收集器
‐XX:+UseSerialOldGC     开启 SerialOld 收集器

2.2 吞吐量优先

-XX:+UseParallelGC       开启 ParallelScavenge 收集器
XX:+UseParalledlOldGC    开启 ParallelOld      收集器
‐XX:ParallelGCThreads    设置GC工作的线程数量[同样使用于CMS]

2.3 响应速度优先

-XX:+UseParNewGC               开启 ParNew 收集器
-XX:+UseConcMarkSweepGC        开启 CMS 收集器
‐XX:+UseCMSCompactAtFullCollection   开启空间压缩(处理空间碎片)
‐XX:ConcGCThreads                    设置并发的FullGC线程数[(ParallelGCThreads+3)/4 ParallelGCThreads 默认=cpu核心数量]
‐XX:CMSFullGCsBeforeCompaction       设置空间压缩的频次[默认0,每次FullGC后都会压缩一次]
‐XX:CMSInitiatingOccupancyFraction   设置FullGC触发阈值[1.6+默认是92,之前62]
‐XX:+UseCMSInitiatingOccupancyOnly   只使用设定的回收阈值(‐XX:CMSInitiatingOccupancyFraction设定的值),如果不指定,JVM仅在第一次使用设定值,后续则会自动调整
‐XX:+CMSScavengeBeforeRemark         在CMS GC前启动一次MinorGC,目的在于减少老年代对年轻代的引用,降低CMS GC的标记阶段时的开销,一般CMS的GC耗时80%都在remark阶段

或者

‐XX:+UseG1GC              开启G1收集器
‐XX:G1HeapRegionSize      设置分区大小(1MB~32MB,必须是2的幂,默认分为2048个分区)
‐XX:MaxGCPauseMillis      设置目标暂停时间(默认200ms)
‐XX:G1NewSizePercent      设置新生代内存初始空间(默认整堆5%)
‐XX:G1MaxNewSizePercen    设置新生代内存最大空间
‐XX:TargetSurvivorRatio   设置Survivor区的填充容量(默认50%,当年轻代空间被占用超过50%,则将对象根据年龄由小到大累加,当累加对象空间占用达到50%时将大于等于此年龄的对象转移到老年代)
‐XX:InitiatingHeapOccupancyPercent    设置混合回收触发阀值(默认45%,设置老年代占用空间达到整堆内存阈值)
‐XX:G1HeapWastePercent                设置停止默认region回收阀值(默认5%,空闲出来的Region数量达到了堆内存的5%停止回收)。
‐XX:G1MixedGCLiveThresholdPercent     设置region回收阀值(默认85%,存活对象低于这个值时才会回收)
‐XX:G1MixedGCCountTarget              设置赛选回收次数(默认8次)

三、开启GC日志

‐XX:+PrintGCDetails     打印GC日志
‐XX:+PrintGCTimeStamps  打印GC时间
‐XX:+PrintGCDateStamps  打印GC日期
‐Xloggc                 将GC日志保存为文件,比如‐Xloggc:./gc.log

四、开启TLAB

-XX: +UseTLAB

五、关闭逃逸分析

-XX:-DoEscapeAnalysis

 

六、Jvm 监控

javap      java字节码信息查看工具
jps        java虚拟机进程信息工具
jinfo      java虚拟机进程配置信息工具
jstat      java虚拟机进程统计信息监控工具
jstack     java虚拟机进程堆栈跟踪工具, 制作线程Dump
jmap       java虚拟机进程堆内存映射,制作堆Dump
jconsole   用于提供JVM活动的图形化视图,包括线程的使用、类的使用和GC活动.
jvisualvm  监控JVM的GUI工具,可用来剖析运行的应用,分析JVM堆转储.

七、Linux监控命令

top	    实时显示正在执行进程的 CPU 使用率、内存使用率以及系统负载等信息
vmstat	对操作系统的虚拟内存、进程、CPU活动进行监控
pidstat	监控指定进程的上下文切换
iostat	监控磁盘IO
free    内存使用情况
df      磁盘使用情况

第三方监控工具 MAT、GChisto、JProfiler、Arthas。

参考资料

JVM 深入浅出 - [垃圾回收]

JVM 深入浅出 - [TLAB + 逃逸分析]

其它的优化方案欢迎大家留言补充。

你可能感兴趣的:(Java,java)