gpt4 book ai didi

java - 如何在 Java 中读取 Java 进程的 Windows "Virtual Bytes"性能计数器?

转载 作者:行者123 更新时间:2023-12-01 05:28:31 27 4
gpt4 key购买 nike

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

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

编辑:自从提出这个问题以来,我尝试了几种不同的方法,但到目前为止没有成功。事实证明,winpack.jar 允许注册表访问,并且有一个注册表项 RegistryKey.PERFORMANCE_DATA 据说可以通过类似注册表的访问来提供对性能数据的访问,但我总是没有得到任何 key 。我找到了一些sample code在 VB 中,使用此方法获取性能数据,即使使用该代码,我也没有返回任何数据。这是在Win7Pro桌面上。默认情况下此数据不可用吗?

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

PerformanceCounter PC = new PerformanceCounter();
PC.CategoryName = "Process";
PC.CounterName = "Virtual Bytes";
PC.InstanceName = "Java#1";
PC.ReadOnly = true;
float VirtualBytes = PC.NextValue();

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

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

最佳答案

事实证明WinPack.jar图书馆直接提供此信息!我没有找到任何帮助我找到这个的文档。只要浏览它的 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进程的虚拟地址空间使用情况。它不是通用解决方案,但它可能会帮助其他想要记录同类信息的人。

关于java - 如何在 Java 中读取 Java 进程的 Windows "Virtual Bytes"性能计数器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9398896/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com