我怎样才能看窗户;“虚拟字节”;Java进程的性能计数器(Java)?

我怎样才能看窗户;“虚拟字节”;Java进程的性能计数器(Java)?,java,java-native-interface,monitoring,performancecounter,Java,Java Native Interface,Monitoring,Performancecounter,也许为了不必滚动我自己的JNI代码,我可以利用它,如何读取Java服务的“虚拟字节”性能计数器?该服务将读取自己的性能计数器,以便定期记录正在使用的虚拟地址空间的数量。目前,它记录操作系统JMX MBean返回的JMX值“CommittedVirtualMemorySize”,但这只显示了提交的内存量,因此无法真正帮助您了解是否即将耗尽虚拟地址空间 这适用于基于Java的服务器进程,其中Java编译器线程有时会耗尽C堆,使整个JVM在进程中崩溃。我自己的代码不是罪魁祸首——而是JVM本身。但此诊

也许为了不必滚动我自己的JNI代码,我可以利用它,如何读取Java服务的“虚拟字节”性能计数器?该服务将读取自己的性能计数器,以便定期记录正在使用的虚拟地址空间的数量。目前,它记录操作系统JMX MBean返回的JMX值“CommittedVirtualMemorySize”,但这只显示了提交的内存量,因此无法真正帮助您了解是否即将耗尽虚拟地址空间

这适用于基于Java的服务器进程,其中Java编译器线程有时会耗尽C堆,使整个JVM在进程中崩溃。我自己的代码不是罪魁祸首——而是JVM本身。但此诊断数据将帮助我了解服务的完整虚拟地址空间需求

编辑:自从提出这个问题以来,我尝试了几种不同的方法,到目前为止都没有效果。事实证明,winpack.jar允许注册表访问,并且有一个注册表项
RegistryKey.PERFORMANCE\u DATA
,它应该通过类似注册表的访问提供对性能数据的访问,但我始终没有得到任何键。我在VB中发现了一些使用这种方法来获取性能数据的代码,即使使用这种代码,我也没有得到任何数据。这是在Win7Pro桌面上。默认情况下,此数据不可用吗

如果我无法使该方法工作,那么我认为唯一的其他选择是尝试使用jniwrap或winpack以某种方式在Java中执行与此C代码等效的代码:

但我想不出一个好办法来做这件事。是否有熟悉Jniwrapper/winpack或通过注册表获取性能数据的人可以建议一种方法

我认识到总是有可能编写一个外部C#程序或WMI脚本来获取此信息,但我希望这比直接以编程方式访问此信息要慢几个数量级(并且要实现更多的工作)。

事实证明,库目录提供了此信息!我没有找到任何帮助我找到这个的文档。只要浏览一下它的API文档并进行实验,我就能够得到这段代码。如果正在使用库的最新版本,请将
MemoryStatus
替换为
MemoryInfo

import com.jniwrapper.win32.system.MemoryStatus;

...

private void test() {
  MemoryStatus mStatus = new MemoryStatus();
  System.out.println("TotalVirtual: " + getBytesInMB(mStatus.getTotalVirtual()) + " MB");
  System.out.println("AvailVirtual: " + getBytesInMB(mStatus.getAvailVirtual()) + " MB");
  System.out.println("UsedVirtual:  " + getBytesInMB(mStatus.getTotalVirtual() - mStatus.getAvailVirtual()) + " MB");
}

private long getBytesInMB(final long input) {
  return input / 1024 / 1024;
}

这就给出了我想要的——运行此代码的Java进程的虚拟地址空间使用情况。这不是一个通用的解决方案,但它可能会帮助其他想要记录相同类型信息的人。

在c#中创建一个dll,并使用java com桥从java调用它。这可能是最简单的解决方案,因为在c#中,这些东西非常简单。
import com.jniwrapper.win32.system.MemoryStatus;

...

private void test() {
  MemoryStatus mStatus = new MemoryStatus();
  System.out.println("TotalVirtual: " + getBytesInMB(mStatus.getTotalVirtual()) + " MB");
  System.out.println("AvailVirtual: " + getBytesInMB(mStatus.getAvailVirtual()) + " MB");
  System.out.println("UsedVirtual:  " + getBytesInMB(mStatus.getTotalVirtual() - mStatus.getAvailVirtual()) + " MB");
}

private long getBytesInMB(final long input) {
  return input / 1024 / 1024;
}