JVM系列(七)[JVM实战调优之:认识并观察GC日志,衡量JVM-GC的两个指标,如何定位JVM运行中的问题]

本文介绍了JVM的命令行参数,特别是与GC相关的参数,通过实例展示了如何观察和理解GC日志。讨论了衡量JVM-GC的两个关键指标——吞吐量和响应时间,并提供了定位JVM运行中问题的步骤,包括使用监控工具、日志分析和问题排查技巧。
摘要由CSDN通过智能技术生成

认识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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值