【笔记】JVM运行时环境参数

前言

JVM运行时环境参数学习笔记

指定虚拟机栈内存

  • 虚拟机栈存放的是Java程序运行时的线程
  • 每个栈由多个栈帧组成,对应着每次方法调用时所占用的内存
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的方法
  • 虚拟机栈内存:Java程序运行时的线程所占用的内存最大值
    • Windows默认虚拟机栈内存是默认虚拟内存
    • Linux/MacOS默认虚拟机栈内存是1024KB
  • 由于操作系统的内存总和是一定的,所以如果虚拟机栈内存越大(单个线程可以使用的内存越大),那么一个进程可以创建的线程总数将越小,所以虚拟机栈内存不是越大越好

-Xss:指定虚拟机栈内存

1
java -jar xxx.jar -Xss1m

堆内存初始大小

1
java -jar xxx.jar -Xms4g

堆内存最大大小

  • 每当Java程序new出新对象时,都会将对象放入堆内存
  • 堆内存中的数据是线程共享的,所以需要考虑线程安全问题
  • 堆内存有垃圾回收机制
  • 为了找到堆内存溢出的问题,通常可以将堆内存设置小一点,这样可以将问题尽早暴露,避免因堆内存过大导致错过堆内存溢出的问题

-Xmx:指定堆内存

1
java -jar xxx.jar -Xmx4g
1
java -jar xxx.jar -XX:MaxHeapSize=4g

新生代初始大小和最大大小

1
java -jar xxx.jar -Xmn4g

新生代初始大小

1
java -jar xxx.jar -XX:NewSize=4g

新生代最大大小

1
java -jar xxx.jar -XX:MaxNewSize=4g

幸存区比例

-XX:SurvivorRatio=8:其中8/10表示伊甸园,1/10表示幸存区From,1/10表示幸存区To

1
java -jar xxx.jar -XX:SurvivorRatio=8

动态调整幸存区比例

-XX:InitialSurviorRatio=8:指定初始幸存区比例
-XX:+UseAdptiveSizePolicy:开启动态调整

1
java -jar xxx.jar -XX:InitialSurviorRatio=8 -XX:+UseAdptiveSizePolicy

晋升阈值

  • 当达到晋升阈值时,将会从幸存区晋升到老年代
  • 有的垃圾回收器晋升阈值默认值为6,有的垃圾回收器晋升阈值默认值为15
1
java -jar xxx.jar -XX:MaxTenuringThreshold=15

打印晋升详情

1
java -jar xxx.jar -XX:+PrintTenuringDistribution

永久代大小

  • Java1.8之前用于加载类的空间,占用的是JVM虚拟机的内存

-XX:MaxPermSize=:指定永久代大小

1
java -jar xxx.jar -XX:MaxPermSize=8m

打印GC详情

1
java -jar xxx.jar -XX:+PrintGCDetails -verbose:gc

开启MinorGC

  • 开启在FullGC之前先进行一次MinorGC
1
java -jar xxx.jar -XX:+ScavengeBeforeFullGC

元空间大小

  • Java1.8及之后用于加载类的内存空间,占用的是操作系统的内存

-XX:MaxMetaspaceSize=:指定元空间大小

1
java -jar xxx.jar -XX:MaxMetaspaceSize=8m

StringTable串池桶个数

  • 通过修改StringTable串池桶个数实现StringTable串池的调优
  • StringTable的数据结构是Hash表(数组+链表)实现的,每个数组被称为
    • 在串池中维护大量的字符串时,桶越多,速度越快
    • 在串池中维护少量的字符串时,桶越少,速度越快

-XX:StringTableSize=:指定StringTable串池桶个数,范围为[1009,2305843009213693951]

1
java -jar xxx.jar -XX:StringTableSize=1009

禁用显式的GC调用

  • 因为手动调用GC进行垃圾回收时,不仅会清理新生代,也会清理老年代,会造成程序暂停时间比较长,所以在进行JVM调优时会禁用显式的GC调用,也就是禁用代码中出现的System.gc()调用
1
java -jar xxx.jar -XX:+DisableExplicitGC

完成

参考文献

哔哩哔哩——黑马程序员