JVM参数分类
- 标准:-开头 所有的HotSpot都支持
- 非标准:-X开头 特定版本HotSpot支持的特定支持
- 不稳定:-XX开头 下个版本可能取消
小程序代码
package a.b.c;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
public class SqlGenerator {
public static void main(String[] args) throws InterruptedException {
System.out.println("hello world");
List<byte[]> list = new ArrayList<>();
int i = 1;
int count = 100;
while (i < count) {
byte[] b = new byte[1 * 1024 * 1024];
list.add(b);
System.out.println("allocate" + i + "M byte[]");
i++;
TimeUnit.SECONDS.sleep(1);
}
Scanner scanner = new Scanner(System.in);
String next = scanner.next();
System.out.println("next = " + next);
}
}
1.查看默认JVM参数
jinfo -flags pid
Non-default VM flags:
-XX:CICompilerCount=4 最大的并行编译数
-XX:InitialHeapSize=266338304 初始堆内存大小,单位B
-XX:MaxHeapSize=4229955584 最大堆内存大小,单位B-XX:NewSize=88604672 新生代内存初始内存大小,单位B
-XX:MaxNewSize=1409810432 新生代内存最大内存大小,单位B-XX:OldSize=177733632
-XX:MinHeapDeltaBytes=524288
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:+UseFastUnorderedTimeStamps
-XX:-UseLargePagesIndividualAllocation
-XX:+UseParallelGC
2.堆大小设置
java -Xms10m -Xmx10m a/b/c/SqlGenerator
再次执行 jinfo -flags pid
Non-default VM flags:
-XX:CICompilerCount=4
-XX:InitialHeapSize=10485760 整个堆大小10M
-XX:MaxHeapSize=10485760 整个堆大小10M-XX:NewSize=3145728 新生代3M(其中Eden区2M 2个survivor各1M)
-XX:MaxNewSize=3145728 新生代3M-XX:OldSize=7340032 老年代7M
-XX:MinHeapDeltaBytes=524288
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:+UseFastUnorderedTimeStamps
-XX:-UseLargePagesIndividualAllocation
-XX:+UseParallelGC
3.jmap命令
3.1显示Java堆详细信息
jmap -heap pid
C:\Users\youhuanhuan>jmap -heap 36296
Attaching to process ID 36296, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.221-b11using thread-local object allocation.
Parallel GC with 8 thread(s)Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 10485760 (10.0MB)
NewSize = 3145728 (3.0MB)
MaxNewSize = 3145728 (3.0MB)
OldSize = 7340032 (7.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)Heap Usage:
PS Young Generation
Eden Space:
capacity = 2097152 (2.0MB) 有一次出现这里是1.5M 尼玛的没搞懂
used = 388776 (0.37076568603515625MB)
free = 1184088 (1.1292343139648438MB)
24.71771240234375% used
From Space:
capacity = 524288 (0.5MB)
used = 196608 (0.1875MB)
free = 327680 (0.3125MB)
37.5% used
To Space:
capacity = 524288 (0.5MB)
used = 0 (0.0MB)
free = 524288 (0.5MB)
0.0% used
PS Old Generation 老年代
capacity = 7340032 (7.0MB)
used = 5285064 (5.040229797363281MB)
free = 2054968 (1.9597702026367188MB)
72.00328281947544% used6354 interned Strings occupying 513488 bytes.
3.2生成堆转储快照dump文件
jmap -dump:format=b,file=xxxheapdump.phrof pid
注意:
1.执行这个命令,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用, 线上系统慎用。
2.live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被dump。
jmap -dump:format=b,file=xxxheapdump.phrof,live pid
jmap -dump:live,format=b,file=xxxheapdump.phrof pid
3.3显示堆中对象的统计信息
jmap -histo:live pid
其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。如果指定了live子选项,则只计算活动的对象。
4.垃圾回收统计信息
-XX:+PrintGC 打印GC的简要信息
-XX:+PrintGCDetails 打印GC的详细信息
再次执行 java -Xms30m -Xmx30m -XX:+PrintGCDetails a/b/c/SqlGenerator
D:\work\idea> java -Xms30m -Xmx30m -XX:+PrintGCDetails a/b/c/SqlGenerator
hello world
allocate1M byte[]
allocate2M byte[]
allocate3M byte[]
allocate4M byte[]
allocate5M byte[]
allocate6M byte[]
allocate7M byte[]
[GC (Allocation Failure) [PSYoungGen: 8152K->872K(9216K)] 8152K->8048K(29696K), 0.0059340 secs] [Times: user=0.03 sys=0.09, real=0.01 secs]
allocate8M byte[]
allocate9M byte[]
allocate10M byte[]
allocate11M byte[]
allocate12M byte[]
allocate13M byte[]
allocate14M byte[]
[GC (Allocation Failure) [PSYoungGen: 8202K->824K(9216K)] 15378K->15168K(29696K), 0.0022410 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (Ergonomics) [PSYoungGen: 824K->0K(9216K)] [ParOldGen: 14344K->14964K(20480K)] 15168K->14964K(29696K), [Metaspace: 2664K->2664K(1056768K)], 0.0074978 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]
allocate15M byte[]
allocate16M byte[]
allocate17M byte[]
allocate18M byte[]
allocate19M byte[]
allocate20M byte[]
allocate21M byte[]
[Full GC (Ergonomics) [PSYoungGen: 7493K->2048K(9216K)] [ParOldGen: 14964K->20084K(20480K)] 22457K->22132K(29696K), [Metaspace: 2667K->2667K(1056768K)], 0.0148889 secs] [Times: user=0.09 sys=0.02, real=0.02 secs]
allocate22M byte[]
allocate23M byte[]
allocate24M byte[]
allocate25M byte[]
allocate26M byte[]
[Full GC (Ergonomics) [PSYoungGen: 7328K->7168K(9216K)] [ParOldGen: 20084K->20072K(20480K)] 27412K->27240K(29696K), [Metaspace: 2667K->2667K(1056768K)], 0.0063151 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[Full GC (Allocation Failure) [PSYoungGen: 7168K->7168K(9216K)] [ParOldGen: 20072K->20072K(20480K)] 27240K->27240K(29696K), [Metaspace: 2667K->2667K(1056768K)], 0.0015917 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at a.b.c.SqlGenerator.main(SqlGenerator.java:16)
Heap
PSYoungGen total 9216K, used 7476K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
eden space 8192K, 91% used [0x00000000ff600000,0x00000000ffd4d280,0x00000000ffe00000)
from space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)
to space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)
ParOldGen total 20480K, used 20072K [0x00000000fe200000, 0x00000000ff600000, 0x00000000ff600000)
object space 20480K, 98% used [0x00000000fe200000,0x00000000ff59a058,0x00000000ff600000)
Metaspace used 2698K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 289K, capacity 386K, committed 512K, reserved 1048576K
4.1GC日志详解
xxx
5.dump文件
内存溢出时自动生成dump文件
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./heapdump.hprof
-XX:+HeapDumpOnOutOfMemoryError 参数在OOM的时,会在当前执行命令的目录下形成一个内存dump文件(如java_pid19540.hprof文件)。
-XX:HeapDumpPath 参数是指定dump文件存放目录。
6.jps(Java Virtual Machine Process Status Tool)
显示当前所有java进程pid的命令。
[-options]
-l 输出应用程序main class的完整package名或者应用程序的jar文件完整路径名
-m
-q 只显示pid
-v 输出传递给JVM的参数
7.jstack pid
显示进程中的线程信息。
6.配置idea启动参数
6.1配置页面:
2.2 -XX:+PrintGCDetails 运行程序后,GC日志就可以打印出来了
[PSYoungGen: 65024K->10721K(75776K)]
意思是:GC之前,用了65M左右的内存,GC之后,用了10M内存,一共回收了将近55M。内存大小一共是75M左右。