监视Java中的非页面工具(内存)
有没有一种方法可以监视Java中内存的非分页池区域?监视Java中的非页面工具(内存),java,memory,Java,Memory,有没有一种方法可以监视Java中内存的非分页池区域? 我发现的唯一一个只能读取正在使用的内存总量,而不能读取内存的特定区域。我决定使用并调用它来解决这个问题。调用命令行可能代价高昂,而且非常难看,因为我需要每秒检查正在运行的进程和非页面工具。 幸运的是,用JNA实现这一点并不难: 主类: import com.sun.jna.Native; public class JNA_PSAPI_Test_optimized { public static native boolean Get
我发现的唯一一个只能读取正在使用的内存总量,而不能读取内存的特定区域。我决定使用并调用它来解决这个问题。调用命令行可能代价高昂,而且非常难看,因为我需要每秒检查正在运行的进程和非页面工具。
幸运的是,用JNA实现这一点并不难: 主类:
import com.sun.jna.Native;
public class JNA_PSAPI_Test_optimized {
public static native boolean GetPerformanceInfo(PerformanceInformationStruct pPerformanceInformation, int cb);
static {
Native.register("psapi");
}
public static void main(String[] args) throws InterruptedException {
PerformanceInformationStruct tPerfInfo = new PerformanceInformationStruct();
while (true){
GetPerformanceInfo(tPerfInfo, 104);
System.out.println("nonPagedPool (MB): "+tPerfInfo.KernelNonpaged * tPerfInfo.PageSize / Math.pow(1024,2));
Thread.sleep(1000);
}
}
}
结构类:
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
public class PerformanceInformationStruct extends Structure {
public int cb;
public long CommitTotal;
public long CommitLimit;
public long CommitPeak;
public long PhysicalTotal;
public long PhysicalAvailable;
public long SystemCache;
public long KernelTotal;
public long KernelPaged;
public long KernelNonpaged;
public long PageSize;
public int HandleCount;
public int ProcessCount;
public int ThreadCount;
public PerformanceInformationStruct() {
super();
}
@Override
protected List<String> getFieldOrder() {
return Arrays.asList(new String[]{"cb", "CommitTotal", "CommitLimit", "CommitPeak", "PhysicalTotal", "PhysicalAvailable", "SystemCache", "KernelTotal", "KernelPaged", "KernelNonpaged", "PageSize", "HandleCount", "ProcessCount", "ThreadCount"});
}
}
导入java.util.array;
导入java.util.List;
导入com.sun.jna.Structure;
公共类性能信息结构扩展结构{
公共交通局;
公共长期委员会;
公众长期承诺限制;
公共长线电话;
公共长期体检;
公共长期物理可用性;
公共长系统缓存;
公共长核总数;
公共长内核页面;
公共长粒非包装;
公共长页面大小;
公共国际HandleCount;
公共int进程计数;
公共int线程数;
公共绩效信息结构(){
超级();
}
@凌驾
受保护列表getFieldOrder(){
返回数组.asList(新字符串[]{“cb”、“CommitTotal”、“CommitLimit”、“CommitPeak”、“PhysicalTotal”、“PhysicalAvailable”、“SystemCache”、“KernelTotal”、“KernelPaged”、“KernelNonPage”、“PageSize”、“HandleCount”、“ProcessCount”、“ThreadCount”});
}
}
你是这个意思吗?非分页池仅由windows上的内核和驱动程序使用,Java无法访问。你需要找到一个命令行工具来告诉你这一点。是的,这就是我的意思。我之所以要监视nonPagedPool,是因为在使用某个程序时,该区域发生内存泄漏。我已经编写了一个powershell脚本,可以做到这一点。现在,我想在一个带有GUI的工具中实现这一点。您可以编写一个带有GUI的Java程序,该程序调用命令行或JNA调用来提供您需要的信息。由于这完全依赖于系统,您需要了解如何在任何环境中为windows执行此操作,然后可以从Java调用此操作。