线上jvm参数

  • 参考其他人的设置:服务器内存15G,war包启动命令如下
nohup  java   -Xms7168m -Xmx7168m -Xmn4096m -XX:SurvivorRatio=8  -XX:-UseAdaptiveSizePolicy
-XX:PretenureSizeThreshold=10485760 -XX:+UseParNewGC -XX:+UseConMarkSweepGC -jar /usr/soft/aaa.war
  • 各参数解释

-Xms7168m       堆内存分配7G
-Xmx7168m      最大堆内存7G

-Xmn4096m     新生代分配4G

-XX:SurvivorRatio=8   E区与S区比例为8:1:1,即S区是E区的1/8

-XX:-UseAdaptiveSizePolicy   取消自适应策略, 如果开启 AdaptiveSizePolicy,则每次 GC 后会重新计算 Eden、From 和 To 区的大小,计算依据是 GC 过程中统计的 GC 时间、吞吐量、内存占用量 开启 AdaptiveSizePolicy 的参数为: -XX:+UseAdaptiveSizePolicy

-XX:PretenureSizeThreshold=10485760     最大对象的阈值是10M,意思是新生对象大于等于10m时,直接进入老年代。

-XX:+UseParNewGC        新生代采用ParNew垃圾回收器

-XX:+UseConMarkSweepGC   老年代采用CMS垃圾回收器

自己的生产环境准备的参数:

JAVA_OPTS="-Xms7168m -Xmx7168m -Xmn4096m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=256m -XX:SurvivorRatio=8 -XX:-UseAdaptiveSizePolicy -XX:PretenureSizeThreshold=10485760 -XX:+UseParNewGC -XX:+UseConMarkSweepGC  -XX:CMSInitiatingOccupancyFraction=70"

参数解释

  • 初始化堆内存:-XX:InitialHeapSize=2048m(-Xms2048m -简写)
  • 最大堆内存:-XX:MaxHeapSize=2048m (-Xmx2048m -简写)
  • 设置年轻代大小.:-Xmn512m
  • 线程的堆栈大小:-Xss256k:设置每个线程的堆栈大小.JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右.
  • 初始化永久代堆内存: -XX:PermSize=512m
  • 最大永久代堆内存:-XX:MaxPermSize
  • Eden区与Survivor区的大小比值:-XX:SurvivorRatio=8    设置年轻代中Eden区与Survivor区的大小比值.设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的 1/10
  • 年轻代与老年代的比:-XX:NewRatio=4   设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代).设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
  • 老年代垃圾收集器:CMS(Concurrent Mark Sweep)并发标记清理收集器:CMS(-XX:+UseConcMarkSweepGC)收集器在老年代使用,专门收集那些在主要回收中不可能到达的年老对象。它与应用程序并发执行,在年老代保持一直有足够的空间以保证不会发生年轻代晋升失败。
  • -XX:CMSFULLGCsBeforCompaction=5:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间会产生“碎片”,使得运行效率低。此值设置运行多少次GC以后对内训空间进行压缩、整理。
  • -XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片。
  • 为了减少第二次暂停的时间,开启并行remark: -XX:+CMSParallelRemarkEnabled
  • CMS次数执行次数:默认CMS是在tenured generation沾满68%的时候开始进行CMS收集,如果你的年老代增长不是那么快,并且希望降低CMS次数的话,可以适当调高此值:-XX:CMSInitiatingOccupancyFraction=80
  • 年轻代的垃圾收集器: -XX:+UseParNewGC :设置年轻代为并行收集。可以和CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行配置,所以无需再配置此值。

### 如何在线上环境中修改JVM参数 在实际生产环境中,通常不建议直接通过命令动态调整已运行的 Java 进程的 JVM 参数,因为这可能会导致不可预测的行为甚至服务中断。然而,可以通过以下几种方式间接实现对 JVM 参数的配置: #### 1. **重启应用并重新设置 JVM 参数** 如果允许停机维护,则可以在应用程序停止后,通过编辑启动脚本中的 `JAVA_OPTS` 或其他相关变量来更新 JVM 参数[^5]。例如: ```bash export JAVA_OPTS="-Xms512m -Xmx1024m -XX:ParallelGCThreads=8 -XX:PermSize=128m -XX:MaxPermSize=256m" ./catalina.sh start ``` #### 2. **使用 JMX 动态调整部分参数** 对于某些支持热加载或动态调整的 JVM 参数(如垃圾回收器行为),可以借助 JMX (Java Management Extensions) 来实时监控和调整这些参数。需要注意的是,并非所有的 JVM 参数都可以被动态更改。 使用 JConsole 或 VisualVM 工具连接到目标 JVM 实例即可完成操作[^4]。 #### 3. **利用 MBeans 接口编程接口** 开发者也可以编写自定义代码调用特定 MBean API 完成一些高级功能,比如调整线程池大小或者 GC 配置等。下面是一个简单的例子展示如何访问 HeapMemoryUsage 数据结构: ```java import com.sun.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; public class GCMonitor { public static void main(String[] args){ for(GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()){ System.out.println(gc.getName()+": "+gc.getCollectionCount()); } } } ``` #### 注意事项 - 不同版本 JDK 支持的功能可能有所差异,请确认所使用的具体版本特性。 - 生产环境下任何变更都应经过充分测试后再实施,以免影响业务正常运转。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITSDSDFSDF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值