jvm调优相关介绍

jvm和gc相关介绍请点击本链接

jvm垃圾回收

啥是java垃圾:

内存中不再使用到的空间就是垃圾。

判断是不是垃圾:

  1. 引用计数法:
    查看对象还保存的有没有引用。没有的话就是垃圾。
    比如说:Object obj = null;。那么这个obj就是垃圾。
  2. 枚举根节点作可达性分析(根路径搜索):
    这个是为了解决引用计数法解决不了的循环引用的问题。就是把一系列的GC Roots对象(就是一组必须活跃的引用)作为根节点往下遍历搜索。能被遍历到的对象就是存活对象。没有遍历到的对象就是需要被回收的对象。
    必须是从GC Root节点遍历到的对象。否则就算是几个对象内部有引用那也是需要被回收的。
    比如下图:jvm调优相关介绍

哪些可以成为GC Root

  1. 虚拟机栈(栈帧中局部变量表)中引用的对象。
  2. 方法区中的类静态属性引用的对象。
  3. 方法区中常量引用的对象。
  4. 本地方法栈引用的对象(Native)。

垃圾回收的根节点。
如下图:
jvm调优相关介绍

jvm参数类型

  1. 标配参数(了解)
    从java1.0到现在基本没有啥变化的。比如:java -version\help等
  2. x参数(了解)
    -Xint:解释执行。-Xcomp:第一次使用就编译成本低代码。-Xmixed:混合模式。如下图:
    jvm调优相关介绍
  3. 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就表示开启了:jvm调优相关介绍
    • KV设值类型:
      • 公式:-XX:属性=数值。比如:-XX:ParallelGCThreads=4
        表示启动了4个gc线程。
        查看:jinfo -flag ParallelGCThreads id号
    • jinfo命令举例:
      查询单个参数的设置:jvm调优相关介绍
      查询所有的参数设置(jinfo -flags 进程号):
      jvm调优相关介绍

jvm常用命令:

java -XX:+PrintCommandLineFlags -version 查看默认的垃圾回收器
java -XX:+PrintFlagsInitial 查看jdk默认的参数初始值
java -XX:+PrintFlagsFinal 查看jdk默认的参数值包括初始值和修改的值。。修改后的值会加一个冒号

jvm调优常用参数:

  1. -Xmx(-XX:InitialHeapSize):最大堆内存,默认是物理内存的1/4
  2. -Xms(-XX:MaxHeapSize):初始大小内存,默认是物理内存的1/64
    -Xmx和-Xms设置为一样的。避免垃圾回收的大起大落。
  3. -Xss(-XX:ThreadStackSize):设置单个线程栈(java栈空间)的大小,一般默认512k·1024k。默认是1024。查默认值的时候它会显示0,这个0表示使用的默认初始值。
  4. -Xmm:设置年轻代的大小,默认是堆的1/3。老年代默认是2/3
  5. -XX:MetaspaceSize:设置元空间的大小。默认只有20多M。
    元空间和永久代类似,都是对于jvm的方法区的实现。只不过永久代使用的是jvm堆的空间内存,元空间使用的本机内存(不是磁盘内存,是内存条的内存)。
  6. -XX:+PrintGCDetails:开启打印GC细节。
    具体年轻代打印含义如下图:
    jvm调优相关介绍
    GC(一般是在年轻代中发生):jvm调优相关介绍
    fullGC(一般在老年代中发生):
    注意这里的图中是永久代,实际上是Metaspce,但是表示的含义是一样的。
    jvm调优相关介绍
  7. -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
  8. -XX:NewRatio:
    设置年轻代和老年代在堆中的占比。年轻代的大小,默认是堆的1/3。老年代默认为2/3。默认:-XX:NewRatio=2。
    比如修改成了-XX:NewRatio=4,那就是老年代是堆的4/5,新生代是堆的1/5。
  9. -XX:MaxTenuringThreshold:
    设置垃圾回收的最大年龄。默认是15(jdk1.8中15也是最高值).如果设置为0的话,那就不会经过幸存区而是直接到年老区。