嘘~ 正在从服务器偷取页面 . . .

jvm常见参数汇总


jvm常见参数汇总

主要是针对之前的学习,进行一个参数的集中整理。

一、环境因素

JVM 中最大堆大小有三方面限制:

  • 相关操作系统的数据模型(32-bt还是64-bit)限制;

  • 系统的可用虚拟内存限制;

  • 系统的可用物理内存限制。32位系统下,一般限制在1.5G ~ 2G;64为操作系统对内存无限制。

在内存自动管理过程中,新生代中的98%对象都是”朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块比较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。当回收时,将EdenSurvivor中还存活着的对象一次性地复制到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。HotSpot虚拟机默认EdenSurvivor的大小比例是8:1,也就是说,每次新生代中可用内存空间为整个新生代容量的90%(80%+10%),只有10%的空间会被浪费。

二、参数使用说明

参数使用是以 -XX:为前缀,中间以 +- 连接,后面跟参数名,如果需要设置参数值的使用赋值符号 = 连接值。

+ :表示启用该参数; - :表示禁用该参数。

如:

-XX:SurvivorRatio=8

三、通用的参数

通用的参数是不需要区分收集器的。

基本常用参数

参数关键词参数说明示例
-Xms设置堆的最小值,初始内存大小。-Xms1024m 堆的初始内存为1G。
-Xmx设置堆的最大值 ,最大可用内存。-Xms1024m 堆的最大可用内存为1G。一般为系统可用内存的1/4大小
-Xmn设置新生代(年轻代)的大小。-Xmn380m 不设置则默认值为堆内存的1/3 。
-Xss设置每个线程的堆栈大小。 在相同物理内存下,减小这个值能生成更多的线程。-Xss128k 一般默认Linux x64为1024K。
-XX:NewSize新生代初始化内存大小,该值需要小于-Xms的值-XX:NewSize=512m
-XX:MaxNewSize新生代可分配内存大小,该值需要小于-Xmx的值-XX:MaxNewSiz=900m
-XX:SurvivorRatio年轻代中 Eden:SFrom:STO=n:1:1-XX:SurvivorRatio=8
-XX:PretenureSizeThreshold设置直接晋升到老年代的对象大小-XX:PretenureSizeThreshold=4m 对象如果超过4M就可以直接晋升到老年代
-XX:MaxTenuringThreshold=0垃圾最大年龄,置垃圾最大年龄。大于这个年龄的都会进入老年代区。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。-XX:MaxTenuringThreshold=0
-XX:MaxTenuringThreshold=15

特别说明:

-Xms :物理内存的1/64(<1GB)。默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制。

-Xmx :物理内存的1/4(<1GB)默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。

-Xmn :整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。 增大年轻代后,将会减小年老代大,此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

-XX:PermSize:物理内存的1/64。

-XX:MaxPermSize :物理内存的1/4。

-Xss: JDK5以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行 调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右
一般小的应用,如果栈不是很深,应该是128k够用的,大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。

-XX:SurvivorRatio: Eden区与Survivor区的大小比值。设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10

-XX:MaxTenuringThreshold:如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率,该参数只有在串行GC时才有效。

直接内存设置

直接内存,就是堆外内存

-XX:MaxDirectMemorySize=1024m

当缓冲区分配的堆外内存到达指定大小后,即触发Full GC。注意该值是有上限的,默认是64M,最大为sun.misc.VM.maxDirectMemory(),在程序中中可以获得-XX:MaxDirectMemorySize的设置的值。

方法区/永久代/非堆区

jdk1.7及之前:

-XX:PermSize
-XX:MaxPermSize;

jdk1.8以后:

-XX:MetaspaceSize
-XX:MaxMetaspaceSize

MetaspaceSize 默认20.8M左右(x86下开启c2模式),主要是设置metaspaceGC发生的初始阈值,也是最小阈值,
MaxMetaspaceSize默认基本是无穷大,建议设置,设置后参数会限制metaspace(包括了Klass Metaspace以及NoKlass Metaspace)被committed的内存大小,会保证committed的内存不会超过这个值,一旦超过就会触发GC。

四、垃圾回收统计信息

统计信息参数

参数关键词参数说明
-XX:+PrintGC显示GC
-XX:+PrintGCDetails显示GC详细信息
-XX:+PrintGCTimeStamps显示GC 收回时间戳
-XX:+PrintGCDateStamps打印GC 操作的时间戳
-Xloggc:filename把相关日志信息记录到文件以便分析
-XX:PrintHeapAtGC打印GC前后的详细堆栈信息

五、收集器参数

Serial 串行收集器

Serial / Serial old

无需多线程交互,但无法发挥出多处理器的优势,适合单处理器的机器以及数据量较小的情况。

-XX:+UseSerialGC

虚拟机运行在Client 模式下的默认值,打开此开关后,使用 (新生代)Serial + (老年代)Serial Old的收集器组合进行内存回收。

ParNew 并行收集器

-XX:+UseParNewGC

启用该参数后,使用ParNew + Serial Old 的收集器组合进行内存回收。

Parallel 并行收集器

Parallel / Parallel old

1、年轻代开启并行

jdk5引入,用于对年轻代进行回收,一般用在多线程处理器上。使用以下设置可以开启使用。

-XX:+UseParallerGC

虚拟机server模式,使用Parallel Scavenge+Serial Old的收集器组合进行内存回收。

2、老年代开启并行

jdk6之后可对老年代进行回收,若不打开默认是单线程,使用-XX:+UseParallerOldGC开启使用。

-XX:+UseParallerOldGC

打开此开关后,使用Parallel Scavenge + Parallel Old的收集器组合进行内存回收

Parallel Scavenge 收集器

1、 目标最大停顿

控制最大垃圾收集停顿时间,一般200 ~ 300毫秒。

-XX:MaxGCPauseMillis=200

2、目标吞吐量参数

直接设置吞吐量大小的

-XX:GCTimeRatio=99

值则应当是一个大于0小于100的整数,也就是垃圾收集时间占总时间的比率,相当于吞吐量的倒数。如把此参数设置为19,那允许的最大垃圾收集时间就占总时间的5%(即1/(1+19)),默认值为99,即允许最大1%(即1/(1+99))的垃圾收集时间。

3、自适应策略参数

自适应调节策略参数:

-XX:+UseAdaptiveSizePolicy

参数被激活之后,就不需要人工指定新生代的大小(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRatio)、晋升老年代对象大小(-XX:PretenureSizeThreshold)等细节参数。虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量。这种调节方式称为垃圾收集的自适应的调节策略(GC Ergonomics)。

CMS 收集器

1、启用CMS收集器

-XX:+UseConcMarkSweepGC

打开此开关后,使用ParNew + CMS + Serial Old的收集器组合进行内存回收。
ParNew收集器是激活CMS后(使用-XX:+UseConcMarkSweepGC选项)的默认新生代收集器。
Serial Old收集器将作为 CMS 收集器出现Concurrent Mode Failure失败后的后备收集器使用。

2、老年代阈值触发CMS

老年代使用多少后触发 CMS:

-XX:+CMSInitiatingOccupancyFraction=68%

在JDK 5的默认设置下,CMS收集器当老年代使用了68%的空间后就会被激活,在实际应用中老年代增长并不是太快,可以适当调高参数-XX:CMSInitiatingOccu-pancyFraction的值来提高CMS的触发百分比,降低内存回收频率,获取更好的性能。

3、碎片整理条件参数

CMS 在n次GC后,启动内存碎片整理。

-XX:+CMSFullGCsBeforeCompaction=5

是用于设置执行多少次不压缩的Full GC后,跟着来一次带压缩的(默认值为0,表示每次进入FullGC时都进行碎片整理)。

CMS 完成后,启动内存碎片整理:

-XX:+UseCMSCompactAtFullCollection   

4、增量模式参数

增量模式,适用于单CPU情况:

-XX:+CMSIncrementalMode

5、CMS 年轻代收集并行线程数参数

CMS 年轻代收集方式为并行收集时,使用的CPU数,并行收集线程数。

-XX:ParallelGCThreads=n

G1 收集器

1、G1 启用参数

-XX:+UseG1GC

2、目标最大停顿时间

指定目标的最大停顿时间,默认值是200毫秒。G1尝试调整新生代和老年代的比例,堆大小,晋升年龄来达到这个目标时间。

-XX:MaxGCPauseMillis=200

3、GC工作线程数

设置GC的工作线程数量参数

-XX:ParallerGCThreads=n

其他参数

1、年轻代Eden区占比

年轻代中 Eden:SFrom:STO=n:1:1,第一个表格已说明。

-XX:SurvivorRatio=n

2、直接晋升老年代大小

设置直接晋升到老年代的对象大小,第一个表格已说明。

-XX:PretenureSizeThreshold

3、担保策略参数

老年代的剩余空间不足以应付新生代的整个Eden和Survivor区的所有对象都存活的极端情况时,是否允许分配担保失败:

-XX:HandlePromotionFailure

4、加速编译

加快编译参数,通常在项目稳定之后,改动较小时使用,该参数会在编译时忽略一些Class内部检查。

-XX:+AggressiveOpts

5、线程栈大小参数

-XX:ThreadStackSize=0

0表示使用默认堆栈大小。[Sparc:512;Solaris x86:320(5.0及更早版本中为256);Sparc 64位:1024;Linux amd64:1024(在5.0及更早版本中为0);所有其他0。]

六、JDK 默认GC收集器

jdk1.7 和 jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)。

jdk1.9 默认垃圾收集器G1。

如果想知道自己的运行环境的JVM使用了何种收集器,怎么办?

(1)使用-XX:+PrintCommandLineFlagsjvm参数可查看默认设置收集器类型。

java -XX:+PrintCommandLineFlags -version

(2)使用-XX:+PrintGCDetails参数打印的GC日志的新生代、老年代名称判断收集器类型。

七、参数补充

如果整理遗漏,后续补充。

本次整理日期:2020年7月16日。


参考:
https://blog.csdn.net/wangsweetkid/article/details/94310547
https://www.jianshu.com/p/950e6990bd80
https://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html



版权声明: 本博客所有文章除特別声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明来源 Small-Rose / 张小菜 !
评论
  目录