jvm调优相关介绍
jvm调优相关介绍
jvm垃圾回收
啥是java垃圾:
内存中不再使用到的空间就是垃圾。
判断是不是垃圾:
- 引用计数法:
查看对象还保存的有没有引用。没有的话就是垃圾。
比如说:Object obj = null;。那么这个obj就是垃圾。- 枚举根节点作可达性分析(根路径搜索):
这个是为了解决引用计数法解决不了的循环引用的问题。就是把一系列的GC Roots对象(就是一组必须活跃的引用)作为根节点往下遍历搜索。能被遍历到的对象就是存活对象。没有遍历到的对象就是需要被回收的对象。
必须是从GC Root节点遍历到的对象。否则就算是几个对象内部有引用那也是需要被回收的。
比如下图:![]()
哪些可以成为GC Root
- 虚拟机栈(栈帧中局部变量表)中引用的对象。
- 方法区中的类静态属性引用的对象。
- 方法区中常量引用的对象。
- 本地方法栈引用的对象(Native)。
垃圾回收的根节点。
如下图:
jvm参数类型
- 标配参数(了解)
从java1.0到现在基本没有啥变化的。比如:java -version\help等- x参数(了解)
-Xint:解释执行。-Xcomp:第一次使用就编译成本低代码。-Xmixed:混合模式。如下图:![]()
- xx参数(重点)
-Xmx:1024m和-Xms1024m这种参数也属于XX参数。
-Xms就相当于:InitialHeapSize 。-Xmx就相当于:-XX:MaxHeapSize
- 布尔类型:
- 公式:-XX:+参数。-XX:-参数 (+就表示开启,-就表示关闭)
- 查看java进程:jps -l命令:查看java进程。jinfo -flag PrintGCDetails 13632(这个数字写jps -l查出来的id号):查看当前指定进程的PrintGCDetails参数是否开启生效了。
比如下面查询PrintGCDetails(是否打印垃圾回收细节)是否**。-PrintGCDetails表示没有开启。+PrintGCDetails就表示开启了:![]()
- KV设值类型:
- 公式:-XX:属性=数值。比如:-XX:ParallelGCThreads=4
表示启动了4个gc线程。
查看:jinfo -flag ParallelGCThreads id号- jinfo命令举例:
查询单个参数的设置:
查询所有的参数设置(jinfo -flags 进程号):![]()
jvm常用命令:
java -XX:+PrintCommandLineFlags -version 查看默认的垃圾回收器
java -XX:+PrintFlagsInitial 查看jdk默认的参数初始值
java -XX:+PrintFlagsFinal 查看jdk默认的参数值包括初始值和修改的值。。修改后的值会加一个冒号
jvm调优常用参数:
- -Xmx(-XX:InitialHeapSize):最大堆内存,默认是物理内存的1/4
- -Xms(-XX:MaxHeapSize):初始大小内存,默认是物理内存的1/64
-Xmx和-Xms设置为一样的。避免垃圾回收的大起大落。- -Xss(-XX:ThreadStackSize):设置单个线程栈(java栈空间)的大小,一般默认512k·1024k。默认是1024。查默认值的时候它会显示0,这个0表示使用的默认初始值。
- -Xmm:设置年轻代的大小,默认是堆的1/3。老年代默认是2/3
- -XX:MetaspaceSize:设置元空间的大小。默认只有20多M。
元空间和永久代类似,都是对于jvm的方法区的实现。只不过永久代使用的是jvm堆的空间内存,元空间使用的本机内存(不是磁盘内存,是内存条的内存)。- -XX:+PrintGCDetails:开启打印GC细节。
具体年轻代打印含义如下图:
GC(一般是在年轻代中发生):
fullGC(一般在老年代中发生):
注意这里的图中是永久代,实际上是Metaspce,但是表示的含义是一样的。![]()
- -XX:SurvivorRatio:
设置新生代中伊甸园区(Eden)和幸存者1(s0),2(s1)区的空间比例。s0和s1是一致的。年轻代的大小,默认是堆的1/3。老年代默认为2/3
默认: -XX:SurvivorRatio=8,Eden:s0:s1=8:1:1。
匹配方式:比如-XX:SurvivorRatio=4 那么Eden:s0:s1=4:2:2- -XX:NewRatio:
设置年轻代和老年代在堆中的占比。年轻代的大小,默认是堆的1/3。老年代默认为2/3。默认:-XX:NewRatio=2。
比如修改成了-XX:NewRatio=4,那就是老年代是堆的4/5,新生代是堆的1/5。- -XX:MaxTenuringThreshold:
设置垃圾回收的最大年龄。默认是15(jdk1.8中15也是最高值).如果设置为0的话,那就不会经过幸存区而是直接到年老区。