2016-07-24 84 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。 –