建议先看此博客:还不会JVM,是准备家里蹲吗?
JVM调优参数
堆
参数 | 说明 |
---|---|
-Xms | 初始堆大小(默认物理内存的1/64) |
-Xmx | 最大堆大小(默认物理内存的1/4) |
-verbose:gc | 输出GC情况 |
-Xmn | 新生代大小 |
-XX:NewSize | 设置新生代大小 |
-XX:MaxNewSize | 新生代最大值 |
-XX:PermSize | 设置持久代初始值(默认物理内存的1/64) |
-XX:MaxPermSize | 设置持久代最大值 |
-Xss | 每个线程的堆栈大小 |
-XX:ThreadStackSize | 设置每个线程的堆栈大小 |
-XX:NewRatio | 新生代与老年代比值(默认4) |
-XX:SurvivorRatio | Eden区与Survivor区的比值(默认8) |
-XX:MaxTenuringThreshold | 进入老年代年龄 |
-XX:+AggressiveOpts | 加快编译 |
-Xnoclassgc | 禁用垃圾回收 |
-XX:+HeapDumpOnOutOfMemoryError | 内存溢出异常时Dump出当前的堆内存转储快照 |
-XX:PretenureSizeThreshold | 大于该值直接进入老年代分配(字节为单位) |
并行收集器
参数 | 说明 |
---|---|
-XX: +UseSerialGC | 设置串行收集器 |
-XX:+UseParallelGC | 设置并行收集器 |
-XX:+UseParNewGC | 设置新生代用并行收集 |
-XX:+UseParallelOldGC | 设置老年代用并行收集 |
-XX:ParallelGCThreads | 并行收集器线程数 |
-XX:MaxGCPauseMillis | 新生代每次垃圾回收最大时间 |
-XX:+UseAdaptiveSizePolicy | 自动选择新生代大小和相应的Survivor区比例 |
-XX:GCTimeRatio | 设置垃圾回收时间占程序运行时间的百分比 |
-XX:+ScavengeBeforeFullGC | Full GC前调用YGC |
CMS收集器
参数 | 说明 |
---|---|
-XX:+UseConcMarkSweepGC | 使用CMS内存收集 |
-XX:CMSFullGCsBeforeCompaction | 多少次后进行内存压缩 |
-XX:+CMSParallelRemarkEnabled | 降低标记停顿 |
-XX:+UseCMSCompactAtFullCollection | Full GC时对老年代的压缩 |
-XX:CMSInitiatingOccupancyFraction | 使用多少后开始CMS回收(默认92%) |
-XX:CMSInitiatingPermOccupancyFraction | 永久代达到多少比率时触发(默认92%) |
-XX:+CMSIncrementalMode | 设置为增量模式 |
辅助信息
参数 | 说明 |
---|---|
-XX:+PrintGC | 打印GC信息 |
-XX:+PrintGCDetails | 打印GC详细信息 |
-XX:+PrintGCTimeStamps | 打印GC的时间戳 |
-XX:+PrintGCApplicationStoppedTime | 打印GC时程序暂停时间 |
-XX:+PrintGCApplicationConcurrentTime | 打印GC前程序未中断的执行时间 |
-XX:+PrintHeapAtGC | 打印GC前后堆的信息 |
-Xloggc:filename | 将日志输出到文件(filename)中 |
-XX:+TraceClassLoading | 类加载信息 |
-XX:+TraceClassUnLoading | 类卸载信息 |
-XX:+PrintTLAB | 打印TLAB使用情况 |
通过上述JVM命令参数,我们可以对JVM相应调整,打印辅助信息等,根据具体的业务需求,选择合适的调优方案,比如:
- 吞吐量大优先的配置:
-Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy
新生代老年代都用并行收集器,新生代设置GC最大时间,无法满足此时间自动调整新生代大小,并且自动选择新生代大小和相应的Survivor区比例。 - 响应时间优先的配置
-Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection
设置运行多少次GC以后对内存空间进行压缩、整理,消除并发收集器碎片。
IDEA实战
优先级:全局配置<应用配置
即作用范围越大,优先级越低。
全局配置
Help->Edit Custom VM Options…
在idea64.exe.vmoptions
文件中配置即可,然后需要重启IDEA
应用配置
Run->Edit Configurations…
测试
就顺着上一步的printGC测试一下。
public class Test {
public static void main(String[] args) {
ArrayList<byte[]>list=new ArrayList<>();
for(int i=0;i<10240;i++){
//10G
list.add(new byte[1024*1024]); //1M
}
}
}
虽然通过JVM参数调优,我们可以优化业务,打印辅助信息debug,但是对于大量代码或者肉眼debug出不来时(明明咋看都是对的 ),人工就显得杯水车薪了,这时需要分析Dump文件(-XX:+HeapDumpOnOutOfMemoryError
)安利一款强大的工具——JProfiler,觉得下面麻烦的话再安利一个Dump在线分析网站PerFMa
JProfiler
安装软件
(
插播反爬信息)博主CSDN地址:https://wzlodq.blog.csdn.net/
IDEA集成
File->Settings->Plugins
Dump分析实战
配置参数:-XX:+HeapDumpOnOutOfMemoryError
,OOM时输出Dump文件。
双击这个文件(默认JProfiler打开)
原创不易,请勿转载(
本不富裕的访问量雪上加霜)
博主首页:https://wzlodq.blog.csdn.net/
如果文章对你有帮助,记得一键三连❤
转载:https://blog.csdn.net/qq_45034708/article/details/116295969
查看评论