JVM的Log

  • Post author:
  • Post category:其他
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的创建和释放功能。