jvm学习 - 虚拟机启动常用参数(2)

本文深入解析JVM参数,包括内存管理、垃圾回收器选择及优化技巧。覆盖年轻代、年老代、持久代配置,以及如何平衡响应时间和吞吐量。

介绍

原文地址:1

在启动虚拟机时,可以通过配置不同参数来自定义自己的内存相关信息。

注:以下参数都是直接举例使用,可以通过修改后面的数字和单位直接使用。

参数名称含义默认值使用方式描述
-Xms初始堆大小物理内存的1/64(<1GB)-Xms=2048m默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制.
-Xmx最大堆大小物理内存的1/4(<1GB)-Xmx=4096m默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
-Xmn年轻代大小 -Xmn=1024m此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。
整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.
增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8
-XX:+HeapDumpOnOutOfMemoryError  -XX:+HeapDumpOnOutOfMemoryError在虚拟机发生内存溢出异常时,dump出当前的内存堆转储快照,以便后续分析异常
-XX:NewSize设置年轻代大小(for 1.3/1.4) -XX:NewSize = 512M 
-XX:MaxNewSize设置年轻代最大值(for 1.3/1.4) -XX:MaxNewSize = 1024MJVM堆区域新生代内存的最大可分配大小(PermSize不属于堆区), 生产环境建议设为800M-1024M
-XX:PermSize设置持久代(perm gen)初始值物理内存的1/64-XX:PermSize = 512MJVM初始分配的非堆内存, 不会被回收, 生产环境建议与maxPermSize相同, 设为256m以上
-XX:MaxPermSize设置持久代最大值物理内存的1/4-XX:PermSize = 512M 
-Xss每个线程的堆栈大小 -Xss = 256K

JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右

-XX:ThreadStackSizeThread Stack Size -XX:ThreadStackSize = 1024线程栈深度(0 means use default stack size) [Sparc: 512; Solaris x86: 320 (was 256 prior in 5.0 and earlier); Sparc 64 bit: 1024; Linux amd64: 1024 (was 0 in 5.0 and earlier); all others 0.]
 -XX:NewRatio 年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)   -XX:NewRatio=4 -XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置
 -XX:SurvivorRatio Eden区与Survivor区的大小比值   -XX:SurvivorRatio = 8 设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
 -XX:MaxTenuringThreshold 垃圾最大年龄  -XX:MaxTenuringThreshold = 0 如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代. 对于年老代比较多的应用,可以提高效率.如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活 时间,增加在年轻代即被回收的概率
该参数只有在串行GC时才有效.
 -XX:PretenureSizeThreshold 对象超过多大是直接在旧生代分配  -XX:PretenureSizeThreshold = 2M 单位字节 新生代采用Parallel Scavenge GC时无效
另一种直接在旧生代分配的情况是大的数组对象,且数组中无外部引用对象.
垃圾回收器参数         
 -XX:+UseParallelGC Full GC采用parallel MSC
(此项待验证)
   选择垃圾收集器为并行收集器.此配置仅对年轻代有效.即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集.(此项待验证)
 -XX:+UseParNewGC 设置年轻代为并行收集   可与CMS收集同时使用
JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值
 -XX:ParallelGCThreads 并行收集器的线程数   此值最好配置与处理器数目相等 同样适用于CMS
 -XX:+UseParallelOldGC 年老代垃圾收集方式为并行收集(Parallel Compacting)   
 -XX:MaxGCPauseMillis 每次年轻代垃圾回收的最长时间(最大暂停时间)   如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值.
 -XX:+UseAdaptiveSizePolicy 自动选择年轻代区大小和相应的Survivor区比例   设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开
 -XX:GCTimeRatio 设置垃圾回收时间占程序运行时间的百分比   公式为1/(1+n)
 -XX:+ScavengeBeforeFullGC Full GC前调用YGC   
 -XX:+UseConcMarkSweepGC 使用CMS内存收集   测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明.所以,此时年轻代大小最好用-Xmn设置.???
 -XX:+PrintGCDetails    输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]
[GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
 -XX:+PrintGC    

输出形式:

[GC 118250K->113543K(130112K), 0.0094143 secs]
[Full GC 121376K->10414K(130112K), 0.0650971 secs]

建议

    1. 年轻代大小选择
      • 响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择).在此种情况下,年轻代收集发生的频率也是最小的.同时,减少到达年老代的对象.
      • 吞吐量优先的应用:尽可能的设置大,可能到达Gbit的程度.因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用.
      • 避免设置过小.当新生代设置过小时会导致:1.YGC次数更加频繁 2.可能导致YGC对象直接进入旧生代,如果此时旧生代满了,会触发FGC.
    2. 年老代大小选择
      1. 响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数.如果堆设置小了,可以会造成内存碎 片,高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间.最优化的方案,一般需要参考以下数据获得:
        并发垃圾收集信息、持久代并发收集次数、传统GC信息、花在年轻代和年老代回收上的时间比例。
      2. 吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代.原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象.
    3. 较小堆引起的碎片问题
      因为年老代的并发收集器使用标记,清除算法,所以不会对堆进行压缩.当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象.但是,当堆空间较小时,运行一段时间以后,就会出现"碎片",如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记,清除方式进行回收.如果出现"碎片",可能需要进行如下配置:
      -XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩.
      -XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩
    4. 用64位操作系统,Linux下64位的jdk比32位jdk要慢一些,但是吃得内存更多,吞吐量更大
    5. XMX和XMS设置一样大,MaxPermSize和MinPermSize设置一样大,这样可以减轻伸缩堆大小带来的压力
    6. 使用CMS的好处是用尽量少的新生代,经验值是128M-256M, 然后老生代利用CMS并行收集, 这样能保证系统低延迟的吞吐效率。 实际上cms的收集停顿时间非常的短,2G的内存, 大约20-80ms的应用程序停顿时间
    7. 系统停顿的时候可能是GC的问题也可能是程序的问题,多用jmap和jstack查看,或者killall -3 java,然后查看java控制台日志,能看出很多问题。(相关工具的使用方法将在后面的blog中介绍)
    8. 仔细了解自己的应用,如果用了缓存,那么年老代应该大一些,缓存的HashMap不应该无限制长,建议采用LRU算法的Map做缓存,LRUMap的最大长度也要根据实际情况设定。
    9. 采用并发回收时,年轻代小一点,年老代要大,因为年老大用的是并发回收,即使时间长点也不会影响其他程序继续运行,网站不会停顿
    10. JVM参数的设置(特别是 –Xmx –Xms –Xmn -XX:SurvivorRatio  -XX:MaxTenuringThreshold等参数的设置没有一个固定的公式,需要根据PV old区实际数据 YGC次数等多方面来衡量。为了避免promotion faild可能会导致xmn设置偏小,也意味着YGC的次数会增多,处理并发访问的能力下降等问题。每个参数的调整都需要经过详细的性能测试,才能找到特定应用的最佳配置        

转载于:https://www.cnblogs.com/dengyu/p/10043060.html

### TongWeb 虚拟机启动参数配置指南 在虚拟机环境中部署和运行 TongWeb 应用服务器时,合理的启动参数配置对于性能优化至关重要。以下是关于如何配置 TongWeb 的 JVM 参数以及相关注意事项。 #### 一、JVM 堆内存参数配置 为了确保 TongWeb 在高负载情况下能够稳定运行,可以调整 JVM 的堆内存大小。通过设置 `-Xms` 和 `-Xmx` 参数来定义初始堆内存和最大堆内存的大小: ```bash java -Xms512m -Xmx4g -jar tongweb-application.jar ``` 此命令设置了初始堆内存为 512MB,最大堆内存为 4GB[^2]。如果应用需要处理大量数据或者有较高的并发求,则建议进一步增大堆内存上限。 #### 二、垃圾回收器的选择 针对不同应用场景可以选择合适的垃圾收集器 (GC),以提高系统的吞吐量或降低延迟时间。例如,在生产环境下推荐使用 G1 收集器: ```bash -XX:+UseG1GC ``` 该选项启用 G1 Garbage Collector,适合于大容量内存环境下的高效管理[^2]。 #### 三、永久代/元空间配置 随着 Java 版本升级至 JDK8 及以上版本,“PermGen Space”被替换成了“Metaspace”。因此需注意区分所使用的具体Java版本并做相应调整: 对于 JDK7 或更早版本: ```bash -XX:MaxPermSize=256m ``` 而对于 JDK8+ 则应改为控制 Metaspace 大小: ```bash -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m ``` 这些参数分别指定了元空间的初始大小与最大限制值。 #### 四、线程栈大小设定 默认情况下每个新创建的线程都会分配一定数量的空间作为其调用栈之用,默认值可能因平台而异(通常范围介于320k到1M之间). 如果应用程序存在大量的短生命周期轻量级任务,那么减少单个线程占用资源有助于节省整体消耗. ```bash -Xss256k ``` 这里我们将每个线程所需的最小栈尺寸设为了256KB而不是标准的一兆字节. #### 五、其他常用调试开关 当遇到性能瓶颈问题时开启一些诊断工具可以帮助定位根本原因. 比如打印详细的gc日志信息以便分析是否存在频繁full gc现象影响效率; ```bash -verbose:gc -Xloggc:/path/to/gc.log -XX:+PrintGCDetails ``` 同时也可以监控类加载情况从而发现潜在泄漏风险等问题所在之处. --- ### 注意事项 1. **测试验证**: 修改任何 JVM 参数前都应在非正式环境中充分试验确认效果后再推广实施; 2. **硬件条件匹配**: 所做的改动必须基于实际物理机器规格之上合理规划而不盲目追求极限数值以免适得其反引发更多麻烦; 3. **持续观察记录**: 即使完成初步设置之后仍要保持定期跟踪各项指标变化趋势及时作出微调直至达到最佳状态为止.[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值