x或者xx开头的都是非标准化参数
意思就是说标准化参数不会变,非标准化参数可能在每个jdk版本中有所变化,但是就目前来看x开头的非标准化的参数改变的也是非常少。
格式:-xx:[+-]<name> 表示启用或者禁用name属性。例子:-xx:+useg1gc(表示启用g1垃圾收集器)
-xx:+printcommandlineflags查看当前jvm设置过的相关参数:
jvm参数分类 根据jvm参数开头可以区分参数类型,共三类:“-”、“-x”、“-xx”,
标准参数(-):所有的jvm实现都必须实现这些参数的功能,而且向后兼容;
例子:-verbose:class,-verbose:gc,-verbose:jni……
非标准参数(-x):默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
例子:xms20m,-xmx20m,-xmn20m,-xss128k……
非stable参数(-xx):此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;
例子:-xx:+printgcdetails,-xx:-useparallelgc,-xx:+printgctimestamps……
堆参数设置 -xms 初始堆大小,ms是memory start的简称 ,等价于-xx:initialheapsize-xmx 最大堆大小,mx是memory max的简称 ,等价于参数-xx:maxheapsize
注意:在通常情况下,服务器项目在运行过程中,堆空间会不断的收缩与扩张,势必会造成不必要的系统压力。
所以在生产环境中,jvm的xms和xmx要设置成大小一样的,能够避免gc在调整堆大小带来的不必要的压力。
-xx:newsize=n 设置年轻代大小-xx:newratio=n 设置年轻代和年老代的比值。
如:-xx:newratio=3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4,默认新生代和老年代的比例=1:2。-xx:survivorratio=n 年轻代中eden区与两个survivor区的比值。
注意survivor区有两个,默认是8,表示:eden:s0:s1=8:1:1
如:-xx:survivorratio=3,表示eden:survivor=3:2,一个survivor区占整个年轻代的1/5。
元空间参数 -xx:metaspacesize:metaspace 空间初始大小,如果不设置的话,默认是20.79m,这个初始大小是触发首次 metaspace full gc的阈值。
例如:-xx:metaspacesize=256m
-xx:maxmetaspacesize:metaspace 最大值,默认不限制大小,但是线上环境建议设置。
例如:-xx:maxmetaspacesize=256m
-xx:minmetaspacefreeratio:最小空闲比,当 metaspace 发生 gc 后,会计算 metaspace 的空闲比,如果空闲比(空闲空间/当前 metaspace 大小)小于此值,就会触发 metaspace 扩容。默认值是 40 ,也就是 40%,例如 -xx:minmetaspacefreeratio=40
-xx:maxmetaspacefreeratio:最大空闲比,当 metaspace发生 gc 后,会计算 metaspace 的空闲比,如果空闲比(空闲空间/当前 metaspace 大小)大于此值,就会触发 metaspace 释放空间。默认值是 70 ,也就是 70%,例如 -xx:maxmetaspacefreeratio=70
建议将 metaspacesize 和 maxmetaspacesize设置为同样大小,避免频繁扩容。
栈参数设置 -xss:栈空间大小,栈是线程独占的,所以是一个线程使用栈空间的大小。
例如:-xss256k,如果不设置此参数,默认值是1m,一般来讲设置成 256k 就足够了。
收集器参数设置 serial垃圾收集器(新生代)
开启:-xx:+useserialgc关闭:-xx:-useserialgc//新生代使用serial 老年代则使用serialold
parnew垃圾收集器(新生代)
开启 -xx:+useparnewgc关闭 -xx:-useparnewgc//新生代使用功能parnew 老年代则使用功能cms
parallel scavenge收集器(新生代)
开启 -xx:+useparalleloldgc关闭 -xx:-useparalleloldgc//新生代使用功能parallel scavenge 老年代将会使用parallel old收集器
parallelol垃圾收集器(老年代)
开启 -xx:+useparallelgc关闭 -xx:-useparallelgc//新生代使用功能parallel scavenge 老年代将会使用parallel old收集器
cms垃圾收集器(老年代)
开启 -xx:+useconcmarksweepgc关闭 -xx:-useconcmarksweepgc
g1垃圾收集器
开启 -xx:+useg1gc关闭 -xx:-useg1gc
gc策略参数配置 gc停顿时间,垃圾收集器会尝试用各种手段达到这个时间,比如减小年轻代
-xx:maxgcpausemillis
堆占用了多少比例的时候触发gc,就即触发标记周期的 java 堆占用率阈值。默认占用率是整个 java 堆的 45%
-xx:initiatingheapoccupancypercent=n
新生代可容纳的最大对象,大于则直接会分配到老年代,0代表没有限制。
-xx:pretenuresizethreshold=1000000 //
进入老年代最小的gc年龄,年轻代对象转换为老年代对象最小年龄值,默认值7
-xx:initialtenuringthreshol=7
升级老年代年龄,最大值15
-xx:maxtenuringthreshold
gc并行执行线程数
-xx:parallelgcthreads=16
禁用 system.gc(),由于该方法默认会触发 fgc,并且忽略参数中的 useg1gc 和 useconcmarksweepgc,因此必要时可以禁用该方法。
-xx:-+disableexplicitgc
设置吞吐量大小,默认99
xx:gctimeratio
打开自适应策略,各个区域的比率,晋升老年代的年龄等参数会被自动调整。以达到吞吐量,停顿时间的平衡点。
xx:useadaptivesizepolicy
设置gc时间占用程序运行时间的百分比
gctimeratio
dump异常快照 -xx:+heapdumponoutofmemoryerror
-xx:heapdumppath
堆内存出现oom的概率是所有内存耗尽异常中最高的,出错时的堆内信息对解决问题非常有帮助。
所以给jvm设置这个参数(-xx:+heapdumponoutofmemoryerror),让jvm遇到oom异常时能输出堆内信息,并通过(-xx:+heapdumppath)参数设置堆内存溢出快照输出的文件地址。
这对于特别是对相隔数月才出现的oom异常尤为重要。
-xms10m -xmx10m -xmn2m -xx:survivorratio=8 -xx:+heapdumponoutofmemoryerror -xx:heapdumppath=d:\study\log_hprof\gc.hprof
-xx:onoutofmemoryerror
表示发生oom后,运行jconsole.exe程序。
这里可以不用加“”,因为jconsole.exe路径program files含有空格。利用这个参数,我们可以在系统oom后,自定义一个脚本,可以用来发送邮件告警信息,可以用来重启系统等等。
-xx:onoutofmemoryerror="c:\program files\java\jdk1.8.0_151\bin\jconsole.exe"
8g内存的服务器该如何设置 java -xmx3550m -xms3550m -xss128k -xx:newratio=4 -xx:survivorratio=4 -xx:maxpermsize=16m -xx:maxtenuringthreshold=0
-xmx3500m 设置jvm最大可用内存为3550m。
-xms3500m 设置jvm初始内存为3550m。此值可以设置与-xmx相同,以避免每次垃圾回收完成后jvm重新分配内存。-xmn2g 设置年轻代大小为2g。
整个堆大小=年轻代大小 + 年老代大小 + 方法区大小
-xss128k 设置每个线程的堆栈大小。
jdk1.5以后每个线程堆栈大小为1m,以前每个线程堆栈大小为256k。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
-xx:newratio=4 设置年轻代(包括eden和两个survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5 。
-xx:survivorratio=4 设置年轻代中eden区与survivor区的大小比值。
设置为4,则两个survivor区与一个eden区的比值为2:4,一个survivor区占整个年轻代的1/6 -xx:maxpermsize=16m 设置持久代大小为16m。
-xx:maxtenuringthreshold=0 设置垃圾最大年龄。
如果设置为0的话,则年轻代对象不经过survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在survivor区进行多次复制,这样可以增加对象在年轻代的存活时间,增加在年轻代即被回收的概论。
项目中,gc日志配置 比如,我们启动一个user-service项目:
java -xx:+printgcdetails -xx:+printgcdatestamps -xx:+usegclogfilerotation -xx:+printheapatgc -xx:numberofgclogfiles=5 -xx:gclogfilesize=20m -xloggc:/opt/user-service-gc-%t.log -jar user-service-1.0-snapshot.jar
参数解释:
-xloggc:/opt/app/ard-user/user-service-gc-%t.log 设置日志目录和日志名称 -xx:+usegclogfilerotation 开启滚动生成日志 -xx:numberofgclogfiles=5 滚动gc日志文件数,默认0,不滚动 -xx:gclogfilesize=20m gc文件滚动大小,需开启usegclogfilerotation -xx:+printgcdetails 开启记录gc日志详细信息(包括gc类型、各个操作使用的时间),并且在程序运行结束打印出jvm的内存占用情况 -xx:+ printgcdatestamps 记录系统的gc时间 -xx:+printgccause 产生gc的原因(默认开启)
项目中没用过怎么办? 对于很多没用过的人来说,面试官问项目中这些参数是怎么用?此时,很容易选择妥协,傻傻的回答没用过。
偷偷的告诉你,很多面试官也没有用过。
另外,你可以自己搞个小项目,把jvm参数设置小点,使用测试工具jmeter,多线程测试一下。
以上就是美团面试:熟悉哪些jvm调优参数,幸好我准备过!的详细内容。
