如何以编程方式拦截GC以将信息打印到我的日志中

时间:2012-03-24 04:07:22

标签: java optimization garbage-collection

我知道您可以使用-verbosegc将有关GC的信息打印到sysout但我不希望这样。我想拦截每当GC触发并将有关它的信息打印到我的自定义记录器时,可能会在内部变量上保存上一个GC时间戳等。

这里有什么希望吗?

6 个答案:

答案 0 :(得分:3)

您无法在Java程序中挂钩GC日志记录机制,因为当GC线程运行时,JVM会被有效停止。这样做会导致死锁,所以我们不能这样做。即使使用自定义启动程序尝试通过一些句柄重新打开技术并调用Java来解锁也会死锁。也许如果从自定义启动器中重新打开(我不知道这种或那种方式)缓冲数据并通过JNI从Java跳转到本机以检索缓冲区可能会有效。

答案 1 :(得分:2)

我认为不可能直接这样做。 AFAIK,这种日志记录在非常低的级别执行,实际上超出了普通Java程序的范围。

相反,我认为您必须配置JVM以将GC消息写入已知文件(使用JVM opts),然后使用文件分类器在将消息写入文件时读取消息。

答案 2 :(得分:2)

答案 3 :(得分:1)

您可以将System.out和System.err重定向到日志文件。有一个java.util.logging here的例子。其他包可以做同样的事情AFAIK。

答案 4 :(得分:1)

您可以使用JVM参数-Xloggc:[filename]

答案 5 :(得分:0)

您可以在'finalze()'方法中添加拦截器代码,但为此您必须覆盖所有对象的finalize方法。

另请注意,在GC过程之前不一定要调用finalize方法。