JVM调优和参数配置
Posted 亮子zl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM调优和参数配置相关的知识,希望对你有一定的参考价值。
1.JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots
答:什么是垃圾:简单的说就是内存中已经不再被使用到的空间就是垃圾
要进行垃圾回收,如何判断一个对象是否可以被回收?
1引用计数法
2枚举根节点做可达性分析(根搜索路径)
基本思路就是通过一系列名为“GC Roots”的对象作为起点,从这个被称为GC Roots的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用。也即单个元素的队列。
给定一个集合的引用作为根出发,通过引用关系遍历对象图,能被遍历到的(可到达的)对象就被判定为存活;没有被遍历到的就自然被判定为死亡。
java中可以作为GC Roots的对象:
虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。
方法区中的类静态属性引用的对象。
方法区中常量引用对象。
本地方法栈中JNI(Native方法)引用的对象。
2.JVM调优和参数配置,请问如何盘点查看JVM系统默认值。
答:Xms Xms和Xmx最好要调成一致 避免GC平凡的收集忽高忽低 -Xms 等价于 -XX:InitialHeapSize 初始化的堆内存
-Xmx 等价于 -XX:MaxHeapSize 初始化的堆内存
Xmx:堆空间
Xss:初始栈空间
JVM的参数类型:标配参数
-version 微森、-help 耗破、java-showversion
X参数(了解)
-Xint 解释执行
-Xcomp 第一次使用就编译成本地代码
-Xmixed 混合模式
*XX参数
Boolean类型
公试: -XX:+或者 - 某个属性值
+表示开启
-表示关闭
Case:是否打印GC收集细节
-XX:-PrintGCDetails
-XX:+PrintGCDetails
是否使用串行垃圾回收器
-XX:-UseSerialGC
-XX:+UseSerialGC
KV设值类型
公试:-XX:属性key=属性值value
Case: -XX:MetaspaceSize=128m 21M 元空间
-XX:MaxTenuringThreshold=15
jps:查看进程编号 -l
jinfo举例,如何查看当前运行程序的配置
jinfo -flag MetaspaceSize 4300
题外话(坑题):两个经典参数:-Xms和-Xmx
这个你如何 解释:-Xms 等价于 -xx:InitialHeapSize 初始化的堆内存
-Xmx 等价于 -XX:MaxHeapSize 初始化的堆内存
第一种,查看参数盘点家底
jps -l
jinfo -flag 具体参数 java进程编号
jinfo -flags java进程编号
jinfo -flags PrintGCDetails 13344
第二种,查看参数盘点家底 佛拉歌s 因尼踢奥
查看JVM默认值:-XX:+PrintFlagsInitial
主持要查看初始默认
公式 java -XX:+PrintFlagsInitial -version
java -XX:+PrintFlagsInitial
主要查看修改更新
-XX:+PrintFlagsFinal no
java -XX:+PrintFlagsFinal -version
java -XX:+PrintFlagsFinal
打印命令行参数
克梦按的 赖恩
-XX:+PrintCommandLineFlags
java -XX:+PrintCommandLineFlags -version
方法区
可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。
常用参数配置:
-Xms128m -Xmx4096m -Xss1024k -XX:MetaspaceSize=512m -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseSerialGC
3.你平时工作用过的JVM常用基本配置参数有哪些?
答:常用参数 -Xms:初始大小内存,默认为物理内存1/64
等价于 -XX:InitialHeapSize
-Xmx:最大分配内存,默认为物理内存1/4
等价于 -XX:MaxHeapSize
-Xss:设置单个线程栈的大小,一般默认为512K - 1024K
等价于:-XX:ThreadStackSize ThreadStackSize=0如果是0用的就是系统出厂默认值。
-Xmn:设置年轻代
-XX:MetaspaceSize :设置元空间大小 默认20多M 美特思贝思
元空间的本质和永久代类似,都是对JVM规范中方法区的实现。
不过元空间与永久代之间最大的区别在于:
元空间并不在虚拟机中,而是使用本地内存
因此,默认情况下,元空间的大小仅受本地内存限制
-Mms10m -Xmx10m -XX:MetaspaceSize=1024m -XX:+PrintFlagsFinal
-Mms128m -Xmx4096m -Xss1024m -XX:MetaspaceSize=512m -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseSerialGC
*-XX:+PrintGCDetails 低特奥思
输出详细GC收集日志信息
规律:
GC
【GC类型 GC前新生代内存占用->GC后内存占用 新生代总大小 GC前JVM堆内存占用->GC后JVM堆内存使用 JVM堆总大小 GC耗时 用户耗时 系统耗时 实际耗时】
FullGC
-XX:SurvivorRatio 威小
设置新生代中eden和S0/S1空间的比列
默认
-XX:SurvivorRatio=8,Eden:S0:S1=8:1:1
假如
-XX:SurvivorRatio=4,Eden:S0:S1=4:1:1
SurvivorRatio值就是设置eden区的比例占多少,S0/S1相同
-XX:NewRatio
配置年轻代与老年代在堆结构的占比
默认
-XX:NewRatio=2新生代占1,老年代2,年轻代占整个堆的1/3
假如
-XX:NewRatio=4新生代占1,老年代4,年轻代占整个堆的1/5
NewRatio值就是设置老年代的占比,剩下的1给新生代
-XX:MaxTenuringThreshold
设置垃圾最大年龄
查看默认进入老年代年龄:
jinfo -flag MaxTenuringThreshold 17344(进程编号)
-XX:MaxTenuringThreshold=15
-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。
如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
以上是关于JVM调优和参数配置的主要内容,如果未能解决你的问题,请参考以下文章