认识JVM常用命令行参数
-
JVM的命令行参数参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
-
HotSpot参数分类
标准: - 开头,所有的HotSpot都支持
非标准:-X 开头,特定版本HotSpot支持特定命令
不稳定:-XX 开头,下个版本可能取消
- 常用的查看参数的命令
java -version
java -X
java -XX:+PrintFlagsInitial 默认参数值
java -XX:+PrintFlagsFinal 最终参数值
java -XX:+PrintFlagsFinal -version |grep GC
java -XX:+PrintFlagsFinal | grep xxx 找到对应的参数
认识GC日志和相关参数
一个小程序观察GC日志
这里就是不断的产生不能回收的对象,观察GC
public class HelloGC {
public static void main(String[] args) {
System.out.println("hello gc~");
List<byte[]> list = new LinkedList<>();
for (; ; ) {
list.add(new byte[1024 * 1024]);
}
}
}
区分概念:内存泄漏memory leak,内存溢出out of memory
内存泄漏就是有一块内存,我们用不到 但是GC也无法回收,
内存溢出是分配内存时,发现内存不够用啦
这俩其实没啥必然的联系:
泄漏不一定导致溢出,内存总空间够大的话,浪费一点也不致命;
内存溢出不一定是由内存泄漏导致,内存总空间比较小,程序的对象又很多时,正常的使用也可能内存溢出
java -XX:+PrintCommandLineFlags -version
打印JAVA版本时打印出JVM的一些参数,也可以把-version换成执行的程序
会有些默认的JVM参数:
-XX:InitialHeapSize=267595520 -XX:MaxHeapSize=4281528320 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java -Xmn10M -Xms40M -Xmx60M -XX:+PrintCommandLineFlags -XX:+PrintGC HelloGC
- -XX:+PrintGC 打印GC信息,
关于打印GC的参数还有:
-XX:+PrintGCDetails 打印详细信息,这个下面详细看
-XX:+PrintGCTimeStamps 时间戳
-XX:+PrintGCCause 原因 - -Xmn 年轻代空间的最大值,-XX:MaxNewSize
- -Xms 堆空间的最小值,-XX:InitialHeapSize,即初始大小
- -Xmx 堆空间的最大值,-XX:MaxHeapSize
一般把Xms和Xmx设置成一样的大小,避免堆的扩容和缩容所带来的资源消耗
执行后输出:
GC就是Young GC,年轻代的GC
-XX:InitialHeapSize=41943040 -XX:MaxHeapSize=62914560 -XX:MaxNewSize=10485760 -XX:NewSize=10485760 -XX:+PrintCommandLineFlags -XX:+PrintGC -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
hello gc~
[GC (Allocation Failure) 7289K->5888K(39936K), 0.0025545 secs]
[GC (Allocation Failure) 13212K->13072K(39936K), 0.0019146 secs]
[GC (Allocation Failure) 20554K->20160K(39936K), 0.0016964 secs]
[GC (Allocation Failure) 27481K->27392K(39936K), 0.0019578 secs]
[Full GC (Ergonomics) 27392K->27275K(54784K), 0.0088717 secs]
[GC (Allocation Failure) 34598K->34507K(54784K), 0.0018232 secs]
[GC (Allocation Failure) 41824K->41739K(53760K), 0.0022524 secs]
[Full GC (Ergonomics) 41739K->41611K(59392K), 0.0021946 secs]
[GC (Allocation Failure) 47889K->47851K(59904K), 0.0014204 secs]
[Full GC (Ergonomics) 47851K->47755K(59904K), 0.0021113 secs]
[Full GC (Ergonomics) 54027K->53900K(59904K), 0.0035498 secs]
[Full GC (Ergonomics) 57096K->56972K(59904K), 0.0024055 secs]
[Full GC (Allocation Failure) 56972K->56953K(59904K), 0.0069355 secs]
Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
at com.mashibing.jvm.c5_gc.HelloGC.main(HelloGC.java:16)
java -XX:+UseConcMarkSweepGC -XX:+PrintCommandLineFlags -XX:+PrintGC HelloGC
-XX:+UseConcMarkSweepGC 使用CMS,观察CMS的GC
日志会详细一些,打出来CMS的一些阶段
PS GC日志详解
每种垃圾回收器的日志格式是不同的!
PS日志格式(-XX:+PrintGCDetails)
-XX:InitialHeapSize=41943040 -XX:MaxHeapSize=62914560 -XX:MaxNewSize=10485760 -XX:NewSize=10485760 -XX:+PrintCommandLineFlags -XX:+PrintGC -XX:+PrintGCDetails -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
hello gc~
[GC (Allocation F