2

有什么方法可以挂钩当前正在运行的 JVM 进程的标准输出或将 JVM 进程的标准输出重定向到非文件位置?

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

System.err System.out

两者都是原生的包装器,内部 JVM 输出不会通过这里。两者都看不到此输出(即使重定向或设置为 null,gc 输出也会显示在控制台中)。

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

我也无法获得运行 JVM 的 Process 对象,没有方法,我也无法找到暴露 Process 对象的本机,所以仍然没有有效的方法来读取这些数据。

关于如何在运行时读取 verbose:gc 的任何线索?

4

2 回答 2

0

由于性能原因和文件系统锁定,将详细:gc 写入文件然后读取文件无效选项,

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

您应该注意,文件的 GC 输出是缓冲的,因此它不是实时的(但对于大多数用例来说足够接近)

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

我会考虑获取jstat设计为由程序读取的输出,尽管没有得到那么多细节。

于 2013-11-11T13:32:54.860 回答
0

您可以通过 JMX 获取信息 GC 暂停信息。它不像 GC 日志那样完整,但可以保护您免于解析。SJK 工具是一个 CLI 工具,可以跟踪 JVM 运行进程的 GC 事件。您可以使用它或使用它的代码来构建定制的解决方案。

jstat是另一种选择,但与 JMX 相比,它公开的信息更少,而且在 CMS 收集器的情况下,它的格式会产生误导。

有问题地使用 PerfCounter API 是第三个选项(jstat在内部使用它)。详情见sun.management.counter.perf.PerfInstrumentation课堂。

于 2013-11-11T22:25:04.017 回答