Java(hotspot)详细说明:gc输出在应用程序和运行时使用

时间:2013-11-11 13:02:21

标签: java logging garbage-collection jvm verbose

是否可以挂钩当前正在运行进程的JVM的stdout或将JVM进程的stdout重定向到非文件位置?

我需要verbose:我的应用程序的JVM输出,目前我可以在控制台中看到这个输出但无法将其存储在数据库中或以任何方式处理它,它对运行java应用程序是不可见的。

System.err的 的System.out

两者都是本机包装器,内部JVM输出不在这里传递。 两者都看不到这个输出(如果重定向或设置为null,gc输出显示在控制台中)。

编写详细信息:gc to file然后读取文件无效选项由于性能原因和文件系统锁定,检查热点源没有通过JVM启动标志将输出重定向到非文件位置。

此外我无法获取运行JVM的Process对象,没有这方法,我也无法找到暴露Process对象的native,soo仍然没有有效的方法来读取这些数据。

关于如何在运行时读取详细信息gc的任何线索?

2 个答案:

答案 0 :(得分:0)

  

编写详细信息:gc to file然后读取文件无效选项,原因是性能原因和文件系统锁定,

与实际GCing的成本相比,这样做的成本微不足道。除非你的系统不应该正常GC,否则我不担心。如果您担心的是由于Windows锁定而无法读取文件,则可能会出现问题(或者您可以使用像Linux这样的操作系统不执行此操作)

你应该注意到文件的GC输出是缓冲的,所以它不是实时的(但对于大多数用例而言足够接近)

以编程方式读取输出非常困难,因为它是由多线程GC编写的,即您会对信息进行奇怪的重新排序。

我会考虑获取jstat的输出,该输出旨在由程序读取,但不会得到太多详细信息。

答案 1 :(得分:0)

您可以通过JMX获取GC暂停信息。它没有GC日志那么完整,但可以帮助您解析。 SJK tool是一个CLI工具,可以跟踪JVM运行进程的GC事件。您可以使用它或使用其代码来构建自定义解决方案。

jstat是另一种选择,但与JMX相比,它暴露的信息较少,而且在CMS收集器的情况下,它的格式相当误导。

有问题地使用PerfCounter API是第三个选项(jstat在内部使用它)。有关详细信息,请参阅sun.management.counter.perf.PerfInstrumentation课程。