2016-07-24 62 views
2

有没有办法以编程方式从C++获取当前的jvm统计信息,例如加载的类或当前堆大小?我知道有很多工具可以这样做,但我想将它与不时读取这些统计数据的另一个应用程序集成在一起。从C++监视jvm堆大小

+0

所以从C++运行那些其他工具并收集输出? (如果你在正常的* NIX世界)(不回答,只是可能的解决方法) – Ped7g

+0

大多数工具都是基于GUI的,没有命令行选项。它们似乎是用swing或者其他东西在java中构建的。 –

+1

['jstat'](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html)是一个用于监控堆,gc,类加载和JIT编译的命令行工具。 ['jcmd'](https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html)'PerfCounter.print'也可能有所帮助。 – apangin

回答

0

你可以看看JVMTIJNI

JVMTI使您可以将本地代理连接到一个Java应用程序,与像堆遍历,同时还包括“垃圾收集开始” &“垃圾收集完成”事件,低层次功能的负载可能作为出发点。

JNI允许您从本机代码(反之亦然)调用Java函数。我可以想象,您可以使用此技术从ManagementFactory或某些提供所需信息的类似Java类获取信息。 This post包含了一个关于如何通过JNI调用静态Java方法的完整示例,这应该是一个很好的起点。

+0

JVMTI代理需要由jvm加载。似乎不可能将它稍后附加到jvm上。 是不是使用java代码从jvm中获取信息有点傻?您正在为jvm加载更多东西。你是在干扰监视? –

+0

@LL .:您可以使用'com.sun.tools.attach.VirtualMachine'使用tools.jar将JVMTI代理附加到正在运行的JVM,请看这里:http://docs.oracle.com/javase/6 /docs/jdk/api/attach/spec/com/sun/tools/attach/VirtualMachine.html。 问题是,您需要另一个Java程序来将您的本地代理连接到正在运行的JVM,还没有找到一个解决方案尚未直接从本机代码连接到JVM。 –

+0

在[我自己的问题之一](http://stackoverflow.com/questions/38588632/attach-native-application-via-jni-to-already-running-jvm-on-linux),apangin只是建议我他项目[jattach](https://github.com/apangin/jattach),它看起来很有希望从本机代码附加到正在运行的JVM。 –