jvm 参数配置

java堆栈大小设置相关

-Xms 初始化堆内存大小

初始化堆内存大小,相当于 -XX:initHeapSize ,默认为系统内存的1/64

-Xmx 最大堆内存大小

最大堆内存,相当于 -XX:MaxHeapSize,默认为系统的1/4
jvm启动后,并不会直接让堆内存就扩大到指定的最大数值。而是会先开辟指定的最小堆内存,如果经过数次GC后,还不能,满足程序的运行,才会逐渐的扩容堆的大小,但也不是直接扩大到最大内存。

-Xss 栈空间大小

栈空间 -XX:ThreadStackSize,windows取决于内存大小,而其他系统默认为1024k

-Xmn Young区大小

-XX:MetaspaceSize 元空间

元空间,使用直接内存,理论上受系统内存限制,但有出厂默认值

-XX: SurvivorRatio eden区域相对于suvicel的倍数

eden区域相对于suvicel的倍数,默认为8

-XX: NewRatio 新生代与老年代的比例

新生代与老年代的比例,或者说是老年代相对于新生代的倍数,默认为2

-XX:MaxTenuringThreshold

新生代成员经过多少次GC后到达老年代,默认为15

打印垃圾回收信息及设置垃圾回收器

-XX:+PrintGcDetails 打印GC的详细信息

记录GC运行时的详细数据信息,包括新生占用的内存大小及消耗时间

2.728: [GC (Allocation Failure) [PSYoungGen: 5423K->664K(9216K)] 1385780K->1381029K(1393664K), 0.0098895 secs] [Times: user=0.05 sys=0.00, real=0.01 secs] 

5423K->664K(9216K):新生代GC前内存占用5523K,GC后内存占用664K,新生代总容量9216K。
1385780K->1381029K(1393664K):GC前堆容量占用1385780K,GC后对内存占用1381029K,堆总容量1393664K
0.0098895 secs:GC所花时间
PSYoungGen:年轻代,ParOldGen:老年代,Metaspace:元空间
Times: user表示用户态CPU耗时,sys表示系统CPU耗时,real表示GC实际耗时

-verbose:gc

记录GC运行以及运行时间,一般用来查看GC是否有瓶颈

-XX:-PrintGCTimeStamps 打印收集的时间戳

-Xloggc:filename

将GC日志输出到指定文件。
可以看出GC文件里面包含了JVM的相关参数,如版本号,对内存分配情况,启动参数等。可以看见GC输出使用的是-XX:+PrintGC -XX:+PrintGCTimeStamps这两个参数

-XX:+UseGCLogFileRotation

启用GC日志文件的自动转储

-XX:PrintHeapAtGC 打印GC前后的详细堆栈信息

收集器设置

JVM给了三种选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。JDK5.0以后,JVM会根据当前系统配置进行判断。

-XX:+UseSerialGC:设置串行收集器

吞吐量优先的并行收集器

并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理等。
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:ParallelGCThreads=n: 设置并行收集器收集时使用的 CPU 数。并行收集线程数。
-XX:MaxGCPauseMillis=n: 设置并行收集最大暂停时间
-XX:GCTimeRatio=n: 设置垃圾回收时间占程序运行时间的百分比。公式为 1/(1+n)
-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。

并发收集器设置

并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间。适用于应用服务器、电信领域等
-XX:+UseConcMarkSweepGC:设置并发收集器
-XX:+CMSIncrementalMode: 设置为增量模式。适用于单 CPU 情况。
-XX:ParallelGCThreads=n: 设置并发收集器年轻代收集方式为并行收集时,使用的 CPU
数。并行收集线程数。
-XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩。
-XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩

调试参数

启远程调试的,在启动JVM的命令行添加如下参数:
-Xdebug -Xrunjdwp:transport=dt_socket, address=8888,server=y,suspend=y
-Xdebug : 启用调试
-Xrunjdwp : 启用JDWP实现(JDWP是一个通讯协议),以下是子选项
transport=dt_socket : JPDA front-end和back-end之间的传输方法。dt_socket表示使用套接字传输。
address=8888 :JVM在8888端口上监听请求,如果占用改成其他即可。
server=y :y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是调试器。
suspend=y : y表示启动的JVM会暂停等待,直到调试器连接上。
suspend=y这个选项很重要。如果你想从Tomcat启动的一开始就进行调试,那么就必须设置suspend=y。

调优总结

年轻代大小选择

响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。
吞吐量优先的应用:尽可能的设置大,可能到达Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。

老年代大小选择

响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得:
并发垃圾收集信息
持久代并发收集次数
传统GC信息
花在年轻代和年老代回收上的时间比例
减少年轻代和年老代花费的时间,一般会提高应用的效率

吞吐量优先的应用

一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。

较小堆引起的碎片问题

因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是,当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。如果出现“碎片”,可能需要进行如下配置:
-XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩。
-XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩

jvm的内存限制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值