网站首页 > 精选教程 正文
一、常见JVM参数配置
1.垃圾回收统计信息
- -XX:+PrintGC:输出GC简要信息。
- -XX:+PrintGCDetails:详述GC详细过程。
- -XX:+PrintGCTimeStamps:记录GC发生的时间戳。
- -Xloggc:log/gc.log:指定GC日志输出路径。
- -XX:+PrintHeapAtGC:在每次GC前后展示堆状态。
2.堆设置
- -Xms:设定初始堆大小。
- -Xmx:设定最大堆大小。
- -Xmn:配置年轻代大小。
- -XX:NewRatio:设置年轻代与老年代的容量比例。
- -XX:SurvivorRatio:定义Eden区与Survivor区的容量比例。
- -XX:PermSize:设置永久代初始大小。
- -XX:MaxPermSize:限定永久代最大容量。
- -XX:+MaxTenuringThreshold=<value>:设置对象晋升至老年代所需的年龄。
- -XX:+PretenureSizeThreshold=<value>:大于此值的对象直接进入老年代。
3.栈分配参数
- -Xss:指定每个线程的栈空间大小。
4.垃圾收集器设置
(1)串行收集器(Serial GC)
- -XX:+UseSerialGC:启用串行收集器,适用于小型应用或单处理器环境。
(2)并行回收收集器(Parallel GC)
- -XX:+UseParallelGC:启用并行年轻代收集器。
- -XX:+UseParallelOldGC:启用并行老年代收集器。
- -XX:ParallelGCThreads=<n>:配置并行收集线程数。
- -XX:MaxGCPauseMillis=<n>:设置目标最大暂停时间。
- -XX:GCTimeRatio=<n>:计算程序运行与GC时间比(1/(1+n))。
- -XX:+UseAdaptiveSizePolicy:启用自适应大小调整策略。
(3)CMS并发收集器(Concurrent Mark Sweep)
- -XX:+UseConcMarkSweepGC:启用CMS收集器。
- -XX:ParallelCMSThreads=<n>:设置CMS线程数。
- -XX:CMSFullGCsBeforeCompaction=<n>:设置多少次Full GC后进行内存压缩。
- -XX:+UseCMSCompactAtFullCollection:在Full GC时压缩老年代。
- -XX:+CMSClassUnloadingEnabled:允许卸载类元数据。
- -XX:+CMSParallelRemarkEnabled:启用并行重标记。
- -XX:CMSInitiatingOccupancyFraction=<percent>:设置触发CMS的内存占用比例。
- -XX:+CMSIncrementalMode:启用增量模式。
(4)G1垃圾第一(Garbage-First)收集器
- -XX:+UseG1GC:启用G1收集器。
- -XX:+UnlockExperimentalVMOptions:允许使用实验性选项。
- -XX:MaxGCPauseMills=<n>:设定最大停顿时间目标。
- -XX:GCPauseIntervalMills=<n>:设置期望停顿间隔。
二、JVM的GC性能优化
1.堆大小优化
- MinHeapFreeRatio与MaxHeapFreeRatio:控制堆中空闲空间比例。
- 原则:分配尽可能多的内存给VM。将Xms和Xmx设为相同值以避免堆大小动态调整。随着处理器核心数增加相应增大内存。
2.年轻代优化
- 影响因素:年轻代大小直接影响程序流畅度和GC频率。
- 参数:NewRatio:控制年轻代与老年代比例。NewSize和MaxNewSize:设定年轻代大小范围。SurvivorRatio:调整Eden与Survivor区比例。
- 策略:先确定最大堆大小,再确定最优年轻代大小。老年代应足够容纳所有存活对象,留出10%-20%空余。
3.年轻代大小选择
- 响应时间优先:增大年轻代至接近响应时间限制,减少Minor GC次数和晋升至老年代的对象。
- 吞吐量优先:增大年轻代至可能的最大值(如Gbit级别),利于并行收集。
4.年老代大小选择
- 响应时间优先:使用并发收集器,确保堆大小适中以减少碎片、高回收频率及全停顿。
- 吞吐量优先:设置大年轻代和小老年代,快速回收短期对象,仅保留长期存活对象。
5.应对碎片问题
- 小堆:使用CMS时,堆空间小易产生碎片。可启用-XX:+UseCMSCompactAtFullCollection和设置-XX:CMSFullGCsBeforeCompaction=0以适时压缩老年代。
6.其他优化建议
- 使用64位操作系统,虽然JDK性能略降,但能支持更大内存和更高吞吐。
- 设置XMX与XMS、MaxPermSize与MinPermSize相等,减少堆大小变化带来的压力。
- CMS:选择CMS以缩短停顿时间,配置较小年轻代和并行收集老年代。
- 监控系统状态,使用jmap、jstack或发送killall -3 java命令以分析日志发现问题。
- 若使用缓存,增大年老代,使用LRU策略限制缓存HashMap大小。
- 并发回收时,年轻代适当缩小,老年代增大以利用并发回收特性,避免网站停顿。
7.参数调整与Promotion Failure
- 参数设置无固定公式,需结合实际应用数据(如PV、Old区数据、YGC次数等)进行调整。
- Promotion Failure:可能因Survivor空间不足或老年代空间不足导致。解决方案包括:调整Survivor空间或直接关闭(-XX:SurvivorRatio=65536,-XX:MaxTenuringThreshold=0)。设置合适的CMS触发阈值(如-XX:CMSInitiatingOccupancyFraction=70)以预留足够空间接纳年轻代对象。
8.编程实践中的性能优化
- 减少不必要的对象创建,重用对象或使用基本类型。
- 优先使用局部变量,减少静态变量。
- 避免使用finalize方法。
- 在单线程场景下,选择非线程安全的实现(如HashMap而非HashTable)以减少同步开销。
- 使用位移操作代替乘除运算。
- 对频繁使用的对象进行缓存。
- 优先使用基本类型和一维数组,避免包装类型和二维数组。
- 使用final修饰符提高访问效率。
- 在单线程或局部变量场景下,优先选择StringBuilder而非StringBuffer。
- 注意String对象的不可变性导致的性能损耗,适当使用StringBuffer(考虑预设容量)或StringBuilder。
通过以上对JVM参数配置与GC性能优化的深入理解与实践,可以有效提升Java应用程序的运行效率和稳定性。具体配置应根据实际应用特点进行细致调优,并结合监控数据持续迭代优化策略。
- 上一篇: JVM参数设置方式 jvm 设置
- 下一篇: Java 21 正式发布! java21官方下载入口
猜你喜欢
- 2024-11-01 关于启动电容器的匹配 启动电容器怎么接线
- 2024-11-01 冷水机的基本运行参数包括哪些? 冷水机参数含义
- 2024-11-01 Java线程池解读:从入门到精通,核心参数全掌握!
- 2024-11-01 使用Java编写求和的代码 使用java编写求和的代码是什么
- 2024-11-01 稳压器启动电流多大? 稳压器输出多少正常
- 2024-11-01 Java容器化参数配置最佳实践 java容器有哪几种
- 2024-11-01 Java变量 java变量的数据类型分为两种
- 2024-11-01 深入理解JVM运行原理:从内存布局到执行流程的全面解析
- 2024-11-01 丹佛斯VLT2900变频器维修后试运行参数设置方法及教...
- 2024-11-01 Java 21:有什么新变化? java+21:有什么新变化?举例说明
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)