JVM运行时参数

01-JVM参数选项类型

类型一:标准参数选项

特点:比较稳定,后序版本基本不会变化;以 - 开头

各种选项:运行java或者java -help可以看到所有的标准选项

补充内容:-server 与 -client

Hotspot JVM有两种模式,分别是server和client,分别通过-server和-client模式设置。

1.在32为Windows系统上,默认使用Client类型的JVM。要想使用Server模式,则机器配置至少有2个以上的CPU和2G以上的物理内存。client模式适用于对内存要求比较小的桌面应用程序,默认使用Serial串行垃圾收集器。

2.64位机器上只支持server模式的JVM,适用于需要大内存模式的JVM,适用于需要大内存的应用程序,默认使用并行垃圾收集器。

类型二:-X参数选项

特点:非标准化参数;功能还是比较稳定的,但官方说后续版本可能会变更;以-X开头

各种选项:运行java -X命令可以看到所有的X选项

JVM的JIT编译模式相关的选项

-Xint:禁用JIT,所有字节码都被解释执行,这个模式的速度是最慢的

-Xcomp:所有字节码第一次使用就都被编译成本地代码,然后再执行。

-Xmixed:混合模式,默认模式,让JIT根据程序运行的情况,有选择的将某些代码编译成本地代码

特别的

-Xmx -Xms -Xss属于 XX参数?

-Xms<size>:设置初始java堆大小,等价于-XX:InitialHeapSize

-Xmx<size>:设置最大Java堆大小,等价于-XX:MaxHeapSize

-Xss<size>:设置java线程堆栈大小,-XX:ThreadStackSize

类型三:-XX参数选项

特点:非标准化参数;使用最多的参数类型;这类选项属于实验性,不稳定;以-XX开头

作用:用于开发和调试JVM

分类:Boolean类型格式

-XX:+<option> 表示启用option属性

-XX:-<option> 表示禁用option属性

举例:-XX:+UseParallelGC 选择垃圾收集器为并行收集器;-XX:UseG1GC 表示启用G1收集器;-XX:+UseAdaptiveSizePolicy 自动选择年轻代区大小和相应的Survivor区比例

说明:因为有的指令是默认开启的,所以可以使用-关闭

——非Boolean类型格式(key-value类型)

子类型1:数值型格式-XX:<option> = <number>

number表示数值,number可以带上单位,比如:’m‘、’M‘表示兆,’k‘、’K‘表示Kb,’g‘、’G‘表示g(例如32k跟32768是一样的效果)

例如:

-XX:NewSize=1024m 表示设置新生代的初始大小为1024兆

-XX:MaxGCPauseMillis=500 表示设置GC停顿时间:500毫秒

-XX:GCTimeRatio=19 表示设置吞吐量

-XX:NewRatio=2 表示新生代和老年代的比例

子类型2:非数值型格式-XX:<name> = <string> 

例如:

-XX: HeapDumpPath=/usr/local/heapdump.hprof 用来指定heap转存文件的存储路径

 特别的:-XX:+PrintFlagsFinal

输出所有参数的名称和默认值

默认不包括Diagnostic和Experimental的参数

可以配合-XX:+UnlockDiagnosticVMOptions和-XX:UnlockExperimentalVMOptions使用

02-添加JVM参数选项

Eclipse:

IDEA:

运行jar包

----java -Xms50m -Xmx50m  -XX:+PrintGCDetails  -XX:+PrintGCTimeStamps  -jar  demo.jar

通过Tomcat运行war包

1.Linux系统下可以在tomcat/bin/catalina.sh中添加类似如下配置:JAVA_OPTS="-Xms512m  -Xmx1024m"

2.Windows系统下在catalina.bat中添加类似如下配置:set  "JAVA_OPTS=-Xms512M  -Xmx1024M"

程序运行过程中

使用jinfo -flag <name>=<value> <pid> 设置非Boolean类型参数

使用jinfo -flag [+|-]<name> <pid> 设置Boolean类型参数

03-常用的JVM参数选项

1、打印设置的XX选项及值

2、堆、栈、方法区等内存大小设置

(1)栈

-Xss128k:设置每个线程的大小为128k;等价于-XX:ThreadStackSize=128k

(2)堆内存

-Xms3550m:等价于-XX:InitialHeapSize,设置JVM初始堆内存为3550M

-Xmx3550m:等价于-XX:MaxHeapSize,设置JVM最大堆内存为3550M

-Xmn2g:设置年轻代大小为2g;官方推荐配置为整个堆大小的3/8

-XX:NewSize=1024m, 设置年轻代初始值为1024M

-XX:MaxNewSize=1024m,设置初始代最大值为1024M

-XX:SurvivorRatio=8:设置年轻代中Eden区与一个Survivor区的比值,默认为8

-XX:+UseAdaptiveSizePolicy:自动选择各区大小比例

-XX:NewRatio=4:设置老年代与年轻代(包括一个Eden和两个Survivor区)的比值

-XX:PretenureSizeThreadshold=1024:设置让大于此阈值的对象直接分配在老年代,单位为字节;只对Serial、ParNew收集器有效

-XX:MaxTenuringThreshold=15:默认值为15;新生代每次MinorGC后打印出当前使用的Survivor中对象的年龄分布

-XX:TargetSurvivorRatio:表示MinorGC结束后Survivor区域中占用空间的期望比例。

(3)方法区

永久代:

-XX:PermSize=256m:设置永久代初始值为256M

-XX:MaxPermSize=256m:设置永久代的最大值为256M

元空间:

-XX:MetasapceSize:初始空间大小

-XX:MaxMetaspaceSize:最大空间,默认没有限制

-XX:+UseCompressedOops:压缩对象指针

-XX:+UseCompressedClassPointers:压缩类指针

-XX:CompressedClassSpaceSize:设置Klass Metasapce的大小,默认1G

(4)直接内存

-XX:MaxDirectMemorySize:指定DirectMemory容量,若未指定,则默认与java堆最大值一致。 

3、OutOfMemory相关的选项

(1)-XX:+HeapDumpOnOutOfMemoryError:表示在出现OOM的时候,把Heap转存(Dump)到文件后以便后续分析

(2)-XX:+HeapDumpBeforeFullGC:表示在出现FullGC之前,生成Heap转储文件

(3)-XX:HeapDumpPath:指定Heap转储文件的存储路径。

(4)-XX:OnOutOfMemoryError:指定一个可行性程序或脚本的路径,当发生OOM的时候,去执行这个脚本。

对OnOutOfMemoryError的运维处理

以部署在linux系统/opt/Server目录下的Server.jar为例

1.在run.sh启动脚本中添加jvm参数:

-XX:OnOutOfMemoryError=/opt/Server/restart.sh

2.restart.sh脚本

linux环境:

#!/bin/bash

pid=$(ps -ef|grep Server.jar|awk '{if($8=="java") {print $2}}')

kill -9 $pid

cd /opt/Server/;sh run.sh

Windows环境:

echo off

wmic process where Name='java.exe' delete

cd D:\Server

start run.bat

4、垃圾收集器相关选项

  (1)  查看默认垃圾收集器

--------  -XX:+PrintCommandLineFlags:查看相关命令行参数(包含使用的垃圾收集器)

--------  使用命令行指令:jinfo -flag 相关垃圾回收器参数 进程ID

(2)Serial回收器

--------  Serial收集器作为HotSpot中Client模式下的默认新生代垃圾收集器。Serial Old是运行在Client模式下默认的老年代的垃圾回收器。

--------  -XX:+UseSerialGC:指定年轻代和老年代都是用串行收集器。等价于新生代用Serial GC,且老年代用Serial Old GC。可以获得最高的单线程收集效率。

(3)ParNew回收器

--------  -XX:+UseParNewGC:手动指定使用ParNew收集器执行内存回收任务。它表示年轻代使用并行收集器,不影响老年代。

--------  -XX:ParallelGCThreads=N:限制线程数量,默认开启与CPU数量相同的线程数。

(4)Parallel回收器

  • -XX:+UseParallelGC:手动指定年轻代使用Parallel并行收集器执行垃圾回收任务。
  • -XX:+UseParallelOldGC:手动指定老年代都是使用并行回收收集器
  •           分别适用于新生代和老年代。默认jdk8是开启的。
  •           上面两个参数,默认开启一个,另一个也会被开启。(互相激活)
  • -XX:ParallelGCThreads:设置年轻代并行收集器的线程数。一般地,最好与CPU数量相等,以避免线程数过多影响垃圾收集性能。
  •           在默认情况下,当CPU数量小于8个,ParallelGCThreads的值等于CPU数量。
  •           当CPU数量大于8个,ParellelGCThreads的值等于3+[5*CPU_Count]/8。
  • -XX:MaxGCPauseMillis 设置垃圾回收器的最大停顿时间(即STW的时间)。单位是毫秒。
  •           为了尽可能地把停顿时间控制在MaxGCPauseMillis以内,收集器会在工作时调整Java堆的大小或者一些其他的参数。
  •           对于用户来讲,停顿时间越短体验越好。但是在服务器短,我们注重高并发,整体的吞吐量。所以服务器端适合Parallel,进行控制。
  •           该参数使用需谨慎。
  • -XX:GCTimeRatio:垃圾收集器时间占总运行时间的比例(=1 / (X+1))。用于衡量吞吐量大小。
  •           取值范围(0,100)。默认99,也就是垃圾回收时间不超多1%。
  •           与前一个-XX:MaxGCPauseMillis参数有一定的矛盾性。暂停时间越长,Radio参数就越容易超过设定的比例。
  • -XX:+UseAdaptiveSizePolicy  设置Parallel Scavenge收集器具有自适应调节策略
  •           在这种模式下,年轻代的大小、Eden和Survivor的比例、晋升老年代的对象年龄等参数会被自动调整,已达到在堆大小、吞吐量和停顿时间之间的平衡点。
  •           在手动调优比较困难的场合,可以直接使用这种自适应的方式,仅指定虚拟机的最大堆、目标的吞吐量(GCTimeRatio)和停顿时间(MaxGCPauseMillis),让虚拟机自己完成调优工作。

(5)CMS回收器

  • -XX:+UseConcMarkSweepGC  手动指定使用CMS收集器执行内存回收任务。
  •          开启该参数后会自动将-XX:+UseParkNewGC打开。即ParNew(Young区用)+CMS(Old区用)+Serial Old的组合。
  •        -XX:CMSInitiatingOccupanyFraction:设置堆内存使用率的阈值,一旦达到该阈值,便开始进行回收。
  •          JDK5及以前版本的默认值为68,即当老年代的空间使用率达到68%时,会执行一次CMS回收。JDK6及以上版本默认值为92%。
  •          如果内存增长缓慢,可以设置一个稍大的值,大的阈值可以有效降低CMS的触发频率,减少老年代回收的次数可以较为明显的改善应用程序性能。反之,如果应用程序内存使用率增长很快,则应该降低这个阈值,以避免频繁触发老年代的串行收集器。因此通过该选项可以有效降低Full GC的执行次数。
  • -XX:+UseCMSCompactAtFullGollection 用于指定在执行完Full GC后对内存空间进行压缩整理,以此避免内存对象的产生。不过由于内存压缩整理过程无法并发执行,所带来的问题就是停顿时间变得更长了。
  • -XX:CMSFullGCsBeforeCompaction  设置在执行多少次Full GC后对内存空间进行压缩整理。
  • -XX:ParallelCMSThreads 设置CMS线程数量。
  •           CMS默认启动的线程数是(ParallelGCThreads+3)/4 ,ParallelGCThreads是年轻代并行收集器的线程数。当CPU资源比较紧张时,受到CMS收集器线程的影响,应用程序的性能在垃圾回收阶段可能会非常糟糕。

 

特别说明:

JDK9:新特性:CMS被标记为Deprecate了(JEP291)

          如果对JDK 9及以上版本的HotSpot虚拟机使用参数-XX:+UseConcMarkSweepGC来开启CMS收集器的话,用户会收到一个警告信息,提示将来CMS会被废弃。

JDK14新特性:删除CMS垃圾回收器(JEP363)

          移除了CMS垃圾收集器,如果在JDK14中使用-XX:UseConcMarkSweepGC的话,JVM不会报错,只是会给出一个warning信息,但是不会exit。JVM会自动返回已默认GC方式启动JVM

(6)G1回收器

-XX:+UseG1GC

手动指定使用G1收集器执行内存回收任务。

-XX:G1HeapRegionSize

设置每个Region的大小。值是2的幂,范围是1MB到32MB之间,目标是根据最小的Java堆大小划分出2048个区域。默认是堆内存的1/2000。

-XX:MaxGCPauseMillis:

设置期望达到的最大GC停顿时间指标(JVM会尽力实现,但不保证达到)。默认值是200ms

-XX:ParallelGCThread

设置STW时GC线程数的值。最多设置为8

-XX:ConcGCThreads

设置并发标记的线程数。将n设置为并行垃圾回收线程数(ParallelGCThreads)的四分之一左右。

-XX:InitiatingHeapOccupancyPercent

设置触发并发周期的Java堆占用率。超过此值,就触发GC。默认值是45。

-XX:G1NewSizePercent、-XX:G1MaxNewSizePercent

新生代占用整个堆内存的最小百分比(默认5%)、最大百分比(默认60%)

-XX:G1ReservePersent=10

保留内存区域,防止 to space(Survivor中的to区)溢出。

            mixed gc调优参数

(7)怎么选择垃圾回收器

5、GC日志相关选项

6、其他参数

04-通过Java代码获取JVM参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值