如何查看GC日志和堆栈日志_gc日志的路径在哪里

createh53周前 (02-25)技术教程9

1.GC日志

Java应用程序的GC日志对分析定位很多性能问题有着非常大的帮助。默认情况下,Java应用程序不会自动产生GC日志。如果需要输出GC日志,必须在JVM启动时增加对应的参数。

上图是JVM中一次年老代内存区域GC垃圾回收的输出日志。“[Full GC (Metadata GC Threshold)[PSYoungGen: 14355K->0K(274432K)][ParOldGen: 39413K->32862K(83456K)]53769K->32862K(357888K),[Metaspace:20699K->20699K(1069056K)],0.1843152 secs][Times: user=0.62 sys=0.00,real=0.18 secs]”描述了Full GC发生的原因是Metadata GC Threshold(元数据超过了元数据区域的GC阈值)、年轻代内存使用从14355KB减少为0KB([PSYoungGen:14355K->0K(274432K)])、年老代内存使用从39413KB减少为32862KB([ParOldGen: 39413K->32862K(83456K)])、堆内存的总使用从53769KB减少为32862KB(53769K->32862K(357888K))、元数据空间内存的使用从20699KB减少为20699KB([Metaspace: 20699K->20699K(1069056K)])、Full GC耗时0.1843152秒、用户耗时0.62秒、系统耗时0.00秒、实际耗时0.18秒。从中也可以看出Full GC对用户线程耗时的影响非常大,这就是为什么需要尽量去减少Full GC的原因。

2.线程堆栈

jstack是用于查看JVM线程堆栈的常用工具命令,通过jstack可以获取每个线程内部的调用链以及每个线程当前的运行状态从而可以分析死锁、死循环、响应慢等很多常见的性能问题


上图是以main()方法线程:"main" #1 prio=5 os_prio=0 tid=0x0000000001e5e800 nid=0x3870 runnable[0x000000000292e000]为例来说明线程堆栈中包含的信息,其中tid=0x0000000001e5e800代表了JVM中的线程id,这个是JVM虚拟机根据一定规则生成的一个不重复的线程标志。nid=0x3870代表了本地线程id,也就是操作系统中线程id。这个线程id是用16进制来表示的,0x3870转换成10进制对应的id就是14448。

下图是通过线程堆栈定位问题的步骤

通过线程堆栈定位一些常见问题的方式如下:

(1)JVM进程CPU占用率非常高,请求响应非常慢。

在一个请求被应用程序执行的过程中,多次对JVM进程生成线程堆栈,对比每次线程堆栈中状态为runnable的线程执行的方法是否一样,如果每次都是执行同一个方法,说明这个方法非常占用CPU,并且非常耗时,需要进行优化。如果每次不是在执行同一个方法,可以看一下总共执行了哪些方法,如果方法过多,说明是请求在应用程序中执行的方法过多。

(2)JVM进程CPU占用率不高,请求响应非常慢。

在一个请求被应用程序执行的过程中,多次对JVM进程生成线程堆栈,对比每次线程堆栈中的日志,查看是否线程都出现了类似I/O、数据库查询等待的情况,通过线程堆栈日志定位线程是否一直在等待被占用的其他资源。

(3)请求一直无法被响应。

在一个请求被应用程序执行的过程中,多次对JVM进程生成线程堆栈,对比每次线程堆栈中的日志,查看是否所有的runnable线程都一直在执行相同的方法,若是如此,就说明可能出现了死锁。在发现出现死锁后,可以通过线程堆栈中当前所运行的代码做进一步的分析,确定是在争抢何种资源时导致了死锁。

相关文章

Java中9种常见的CMS GC问题分析与解决(一)

目前,互联网上 Java 的 GC 资料要么是主要讲解理论,要么就是针对单一场景的 GC 问题进行了剖析,对整个体系总结的资料少之又少。前车之鉴,后事之师,美团的几位工程师历时一年多的时间,搜集了内部...

关于Java垃圾回收,你必须要知道FullGC是什么

本文共3198字,是本人前几天面试被提问到的一个问题,将在该文中阐述关于Java垃圾回收——Full GC的相关知识,包括定义、触发条件、具体过程。前几天面试的时候,面试官在最后问了我一个有关Full...

BAT面试题,Java GC(垃圾回收机制),一线大厂面试必问

1.什么是GC?GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

Java中9种常见的CMS GC问题分析与解决(四)

目前,互联网上 Java 的 GC 资料要么是主要讲解理论,要么就是针对单一场景的 GC 问题进行了剖析,对整个体系总结的资料少之又少。前车之鉴,后事之师,美团的几位工程师历时一年多的时间,搜集了内部...

JVM成神路之GC分代篇:分代GC器、CMS收集器及YoungGC、FullGC

引言本篇则重点会对于分代收集器的实现进行全面详解,其中会涵盖串行收集器、并行收集器、三色标记、SATB算法、GC执行过程、并发标记、CMS收集器等知识,本篇则偏重于分析GC机制的落地实现,也就是垃圾收...

argc和argv怎么使用_argc和argv怎么使用c语言

argc指的是参数个数 ,argv指的是参数!如果你程序中用argv 而不是具体的加载某一副图像,则要到DOS窗口运行程序,打开运行-˃cmd-˃d:(你程序所在的盘)-˃cd D:\Opencv P...