你说你做过JVM调优和参数设置,请问如何盘点查看JVM系统默认值?
1、标配参数
-version
-help
java -showversion
2、X参数(了解)
-Xint:解释执行
-Xcomp:第一次使用就编译成本地代码
-Xminxed:混合模式
默认混合模式相当于先javac 再java
3、XX参数
Boolean类型
公式:
-XX:+或-某个属性值
+表示开启
-表示关闭
jinfo举例,如何查看当前运行程序,它的某个JVM参数是否开启?具体值是多少?
jps:可以理解成java ps命令,用于查看Java的后台进程。
jinfo:
jinfo -flag PrintGCDetails 进程号
KV设值类型:
公式:
-XX:属性key=属性值value
例子:
-XX:MetaspaceSize=128m
jinfo -flag MetaspaceSize 进程号
查看该进程的元空间大小。
-XX:MaxTenuringThreshold=15
经过多少次升到老年代
jinfo:
查看当前运行程序的配置。
公式:
"查看一个:jinfo -flag 配置项 进程编号"
"查看所有:jinfo -flags 进程号"
题外话:
两个经典参数:
-Xms和-Xmx
这个如何解释?
-Xms等价于-XX:InitialHeapSize
—Xmx等价于-XX:MaxHeapSize
4、盘点家底查看JVM默认值?
方式一:查看参数
查看一个:jinfo -flag 配置项 进程编号
查看所有:jinfo -flags 进程号
方式二:查看参数
1、主要查看初始化
-XX:+PrintFlagsInitial
公式:
java -XX:+PrintFlagsInitial -version
java -XX:+PrintFlagsInitial
2、主要查看修改更新
-XX:+PrintFlagsFinal
公式:
java -XX:+PrintFlagsFinal -version
打印出来的=表示没修改过
:=表示人为改过或者JVM加载不一样的时候修改过的
PrintFlagsFinal举例子,运行Java命令的同时打印出参数
java -XX :+PrintFlagsFinal -XX:MetaspaceSize=128m T.java
方式三:可以查看到垃圾回收器
-XX:+PrintCommandLineFlags
打印命令行参数
三、你平时工作中用过的jVM常用基本配置参数有哪些?
1、-Xms(如果写-Xms,前面就不要加-XX:)
memory size
初始大小内存,默认为物理内存的1/64。
等价于-XX:InitialHeapSize
2、-Xmx
memory max
最大分配内存,默认为物理内存1/4
等价于-XX:MaxHeapSize
3、-Xss
stack size
设置单个线程堆栈的大小,一般默认为512k-1024k
等价于-XX:ThreadStackSize
jinfo -flag ThreadStackSize 进程号
查出来的结果会是0,表示初始值。
4、-Xmn
设置年轻代大小,"新生代一般是1/3堆空间,老年代一般是2/3堆空间"
5、-XX:MetaspaceSize
设置元空间大小
元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:
"元空间并不在虚拟机中,而是使用本地内存。"
因此,默认情况下,"元空间的大小受本地内存限制"
老师讲的时候查了一下,物理内存16g,元可见大小为20m多一点。
对元空间的调整:
-Xms10m -Xmx10m -XX:MetaSpaceSize=1024m -XX:+PrintFlagsFinal
6、-XX:+PrintGCDetails
输出详细GC收集日志信息
(1)GC
从下图可以看出新生代大概占1/3的堆空间。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200418212901860.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODM2NzgxNw==,size_16,color_FFFFFF,t_70)
(2)FullGC
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200418212926575.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODM2NzgxNw==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200418212954275.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODM2NzgxNw==,size_16,color_FFFFFF,t_70)
比上面的GC多了个Old区。
规律:
名称:GC前内存占用->GC后内存占用 该区内存总大小
7、-XX:SurvivorRatio
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200418212802666.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODM2NzgxNw==,size_16,color_FFFFFF,t_70)
设置新生代中eden和Survivor0/Survivor1空间的比例。
默认:
-XX:SurvivorRatio=8,Eden:S0:S1=8:1:1
假如:
-XX:SurvivorRatio=4,Eden:S0:S1=4:1:1
SurvivorRatio就是设置eden区的比例占多少,S0/S1相同。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200418212826362.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODM2NzgxNw==,size_16,color_FFFFFF,t_70)
8、-XX:NewRatio
配置年轻代和老年代在堆结构的占比
默认
-XX:NewRatio=2新生代占1,老年代占2,年轻代占整个堆的1/3
如果:
-XX:NewRatio=4新生代占1,老年代占4,年轻代占整个堆的1/5。
NewRatio值就是设置老年代的占比,剩下的1给新生代。
9、-XX:MaxTenuringThreshold
设置垃圾最大年龄
只能设置在0-15