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
\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
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);
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
Threads::destroy_vm()
|
|–> exit_globals()
|
|–> ostream_exit()
|
|–> 用delete operator释放掉各个log
总结
Log各个class的实现除了很自然地运用了继承,同时运用重载new/delete operator这个C++特有的技巧,也
有效地封装了log的创建和释放功能。
Log各个class的实现除了很自然地运用了继承,同时运用重载new/delete operator这个C++特有的技巧,也
有效地封装了log的创建和释放功能。