1. JVM参数详解
-verbose:gc
-XX:+PrintGCDetails 打印GC日志信息
-Xms20M 设置堆内存最小值, 默认为物理内存1/64,等价于-XX:InitialHeapSize
-Xmx20M 设置对内存最大值, 默认为物理内存1/4,等价于-XX:MaxHeapSize
-Xmn10M 设置新生代内存大小,
-Xss1024K 设置单个线程栈的大小,一般默认为1024K,等价于-XX:ThreadStackSize
-XX:SurvivorRatio=8 设置Eden区和S0/S1的空间比例大小。(默认 Eden:S0:S1=8:1:1)
-XX:NewRatio=2 设置新生代与老年代在堆内存结构的占比。
默认:-XX:NewRatio=2 新生代占1,老年代占2,新生代占整个堆的1/3.
假设:-XX:NewRatio=4 新生代占1,老年代占4,新生代占整个堆的1/5.
元空间参数设置
默认情况下,元空间的大小仅受本地内存限制,但可以通过以下参数来指定元空间的大小:
-XX:MetaspaceSize 初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
例:-XX:MetaspaceSize=100m
-XX:MaxMetaspaceSize 最大空间,默认是没有限制的。
除了上面两个指定大小的选项以外,还有两个与 GC 相关的属性:
-XX:MinMetaspaceFreeRatio 在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集
-XX:MaxMetaspaceFreeRatio 在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集
-XX:MaxTenuringThreshold=15 设置的是年龄阈值,默认15(对象被复制的次数,达到最大次数后对象从新生代的Survivor区进入到老年代)
2. JVM参数应用
示例代码
/**
* 内存测试
* 设置最小堆内存,最大堆内存,打印GC详细信息,设置初始元空间大小:-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MetaspaceSize=100m
*/
@Slf4j
public class WhileTrueTest {
public static void main(String[] args) throws InterruptedException {
while (true) {
TimeUnit.SECONDS.sleep(1);
log.info("out ---");
}
}
}
2.1 配置打印GC日志信息
2.1.1 默认未配置JVM运行参数
E:\IdeaProjectsStudy\spring-example>jps -l
20960 com.gumj.jvm.WhileTrueTest
11224
16888 sun.tools.jps.Jps
20856 org.jetbrains.jps.cmdline.Launcher
11452 org.jetbrains.idea.maven.server.RemoteMavenServer
20652 org.jetbrains.kotlin.daemon.KotlinCompileDaemon
5420
#查看是否开启PrintGCDetails参数
E:\IdeaProjectsStudy\spring-example>jinfo -flag PrintGCDetails 20960
-XX:-PrintGCDetails
2.1.2 配置JVM运行参数:-XX:+PrintGCDetails
2.1.3 查看已配置GC日志打印信息
E:\IdeaProjectsStudy\spring-example>jps -l
19316 sun.tools.jps.Jps
21060 org.jetbrains.jps.cmdline.Launcher
21108 com.gumj.jvm.WhileTrueTest
11224
11452 org.jetbrains.idea.maven.server.RemoteMavenServer
20652 org.jetbrains.kotlin.daemon.KotlinCompileDaemon
5420
E:\IdeaProjectsStudy\spring-example>jinfo -flag PrintGCDetails 21108
-XX:+PrintGCDetails
配置JVM参数后通过命令jinfo -flag PrintGCDetails 21108 可以看到已经开启了GC日志信息打印
已配置:-XX:+PrintGCDetails
未配置:-XX:-PrintGCDetails
2.2 配置初始元空间大小
2.2.1 查看默认初始元空间大小
E:\IdeaProjectsStudy\spring-example>jinfo -flag MetaspaceSize 21108
-XX:MetaspaceSize=21807104
-XX:MetaspaceSize=21807104 的单位为byte, 换算后约20M
2.2.2 修改初始元空间大小为100M
2.2.3 查看修改后的初始元空间大小
E:\IdeaProjectsStudy\spring-example>jps -l
19652 sun.tools.jps.Jps
11224
21160 org.jetbrains.jps.cmdline.Launcher
11452 org.jetbrains.idea.maven.server.RemoteMavenServer
20252 com.gumj.jvm.WhileTrueTest
20652 org.jetbrains.kotlin.daemon.KotlinCompileDaemon
5420
E:\IdeaProjectsStudy\spring-example>jinfo -flag MetaspaceSize 20252
-XX:MetaspaceSize=104857600
2.3 查看JVM所有参数配置
E:\IdeaProjectsStudy\spring-example>jinfo -flags 9280
Attaching to process ID 9280, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.112-b15
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=10485760 -XX:MaxHeapSize=10485760 -XX:MaxNewSize=3145728 -XX:Min
HeapDeltaBytes=524288 -XX:NewSize=3145728 -XX:OldSize=7340032 -XX:+PrintGCDetails -XX:+UseCompressedClassPointers -XX:+UseCompre
ssedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line: -Xms10m -Xmx10m -XX:+PrintGCDetails -javaagent:D:\devtools\ideaIU-2019.2.2.win\lib\idea_rt.jar=54259:D:\devtools\
ideaIU-2019.2.2.win\bin -Dfile.encoding=UTF-8
2.4查看JVM参数默认值
- java -XX:+PrintFlagsInitial 该命令可以查看JVM所有参数的默认初始值
E:\IdeaProjectsStudy\spring-example>java -XX:+PrintFlagsInitial
[Global flags]
uintx AdaptiveSizeDecrementScaleFactor = 4 {product}
uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product}
uintx AdaptiveSizePausePolicy = 0 {product}
uintx AdaptiveSizePolicyCollectionCostMargin = 50 {product}
uintx AdaptiveSizePolicyInitializingSteps = 20 {product}
uintx AdaptiveSizePolicyOutputInterval = 0 {product}
uintx AdaptiveSizePolicyWeight = 10 {product}
uintx AdaptiveSizeThroughPutPolicy = 0 {product}
- java -XX:+PrintFlagsFinal -version 该命令可以查看JVM所有参数(默认及修改更新后)的值
E:\IdeaProjectsStudy\spring-example>java -XX:+PrintFlagsFinal -version
[Global flags]
uintx AdaptiveSizeDecrementScaleFactor = 4 {product}
uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product}
uintx AdaptiveSizePausePolicy = 0 {product}
uintx AdaptiveSizePolicyCollectionCostMargin = 50 {product}
uintx AdaptiveSizePolicyInitializingSteps = 20 {product}
uintx AdaptiveSizePolicyOutputInterval = 0 {product}
uintx AdaptiveSizePolicyWeight = 10 {product}
uintx AdaptiveSizeThroughPutPolicy = 0 {product}
uintx AdaptiveTimeWeight = 25 {product}
bool AdjustConcurrency = false {product}
在linux中可以使用命令java -XX:+PrintFlagsFinal -version | grep ":"查看那些已经被用户或者JVM设置过的详细的XX参数的名称和值
$ java -XX:+PrintFlagsFinal -version | grep ":"
uintx InitialHeapSize := 57505088 {product}
uintx MaxHeapSize := 920649728 {product}
uintx ParallelGCThreads := 4 {product}
bool PrintFlagsFinal := true {product}
bool UseParallelGC := true {product}
- java -XX:+PrintCommandLineFlags -version 该命令可以查看JVM常用参数值(可查看使用了那种GC收集器)
E:\IdeaProjectsStudy\spring-example>java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=266178880 -XX:MaxHeapSize=4258862080 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseComp
ressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.8.0_112"
Java(TM) SE Runtime Environment (build 1.8.0_112-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixed mode)