JVM的Log

JVM Log机制解析
本文详细介绍了JVM中Log机制的实现原理,包括关键类如outputStream、fileStream等的继承关系,以及如何通过参数设置GC的日志输出。此外,还深入探讨了Log的初始化与释放过程。
JVM在调试版本下,会输出hotspot.log。通过参数-Xloggc:FileName,来设置GC的log。
 
Log的实现主要在
  \hotspot\src\share\vm\utilities\ostream.hpp
  \hotspot\src\share\vm\utilities\ostream.cpp
  \hotspot\src\share\vm\utilities\xmlstream.hpp
  \hotspot\src\share\vm\utilities\xmlstream.cpp
  \hotspot\src\share\vm\utilities\defaultStream.hpp
 
主要的class是:outputStream、fileStream、xmlTextStream、defaultStream
 
继承关系是:
ResourceObj
  |
  |-- outputStream
       |
       |--- fileStream
       |
       |--- xmlTextStream
             |
             |--- defaultStream
 
defaultStream::instance 是其他模块调用的主要接口。
 
Log的初始化
ostream_init()初始化defaultStream::instance
ostream_init_log()初始化JVM的Debug log 和 GC的log,
其中其核心代码是:defaultStream::instance->has_log_file();它转而调用void defaultStream::init_log();这是真正干活的代码了。
defaultStream::init_log的代码写的很清晰,其中只有一个C++的语法点需要注意:重载new operator。
ostream.cpp line 346 
  fileStream* file = new(ResourceObj::C_HEAP) fileStream(try_name);
这是因为outputStream的父类是ResourceObj,ResourceObj重载了new 和 delete operator。关于C++语法就不多说了,太多的好书论及了这个问题。
 
Log的最终释放
Threads::destroy_vm()
   |
   |--> exit_globals()
         |
         |--> ostream_exit()
              |
              |--> 用delete operator释放掉各个log
 
总结
   Log各个class的实现除了很自然地运用了继承,同时运用重载new/delete operator这个C++特有的技巧,也
   有效地封装了log的创建和释放功能。
分析JVM日志文件是排查Java应用程序性能问题、内存泄漏和线程死锁等关键问题的重要手段。JVM日志通常包括垃圾回收(GC)日志、线程快照、堆内存信息等。以下是常用的方法和工具: ### 方法 1. **查看GC日志** JVM可以通过启动参数(如 `-Xlog:gc*` 或 `-verbose:gc`)启用GC日志记录,日志中会包含每次垃圾回收的时间、持续时间、回收前后堆内存的变化等信息。通过分析这些数据,可以评估GC效率并优化堆内存配置。 2. **导出堆栈文件** 利用 `jmap` 或 `jcmd` 工具导出堆内存快照(heap dump),可以进一步分析内存使用情况,识别内存泄漏或大对象占用问题。例如: ```bash jmap -dump:live,format=b,file=heapdump.hprof <pid> ``` 或者使用 `jcmd`: ```bash jcmd <pid> GC.heap_dump /path/to/heapdump.hprof ``` 3. **获取线程快照** 使用 `jstack` 或 `jcmd` 可以生成线程快照,用于分析线程状态、死锁等问题。例如: ```bash jstack <pid> > thread_dump.log ``` 或者: ```bash jcmd <pid> Thread.print > thread_dump.log ``` 4. **分析JVM参数** 通过 `jinfo` 可以查看和修改JVM的运行时参数,帮助确认当前配置是否合理。例如: ```bash jinfo <pid> ``` ### 工具 1. **命令行工具** - `jstat`:用于监控JVM的堆内存和GC活动,例如: ```bash jstat -gc <pid> 1000 5 ``` 该命令每1秒输出一次GC统计信息,共5次。 - `jmap`:生成堆内存快照或查看内存使用情况。 - `jstack`:打印线程快照。 - `jinfo`:查看和修改JVM参数。 - `jcmd`:多功能工具,支持GC、堆内存、线程快照等多种操作。 2. **可视化工具** - **VisualVM**:图形化工具,支持内存分析、线程分析和GC监控。可以加载 `jmap` 导出的堆内存快照文件进行分析。 - **MAT(Memory Analyzer Tool)**:专门用于分析堆内存快照的工具,支持复杂的内存泄漏检测。 - **JProfiler**:商业工具,提供全面的性能分析功能,包括内存、线程和GC分析。 - **YourKit**:商业工具,适用于大型Java应用的性能监控和分析。 - **Flight Recorder(JFR) 和 Mission Control(JMC)**:低开销的生产环境监控工具,能够记录JVM和应用程序的详细运行数据。 3. **GC日志分析工具** - **GCViewer**:开源工具,支持可视化GC日志,帮助评估GC性能。 - **GCEasy**:在线GC日志分析工具,提供详细的GC性能报告。 - **JClarity Censum**:商业工具,支持GC日志分析和性能优化建议。 ### 示例代码 以下是一个简单的Java程序,用于生成GC日志供分析: ```java public class GCTest { public static void main(String[] args) { byte[] data = new byte[1024 * 1024]; // 1MB while (true) { data = new byte[1024 * 1024 * 10]; // 10MB } } } ``` 启动时添加GC日志参数: ```bash java -Xms100m -Xmx200m -Xlog:gc*:file=gc.log:time GCTest ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值