监视Java中的非页面工具(内存)

监视Java中的非页面工具(内存),java,memory,Java,Memory,有没有一种方法可以监视Java中内存的非分页池区域? 我发现的唯一一个只能读取正在使用的内存总量,而不能读取内存的特定区域。我决定使用并调用它来解决这个问题。调用命令行可能代价高昂,而且非常难看,因为我需要每秒检查正在运行的进程和非页面工具。 幸运的是,用JNA实现这一点并不难: 主类: import com.sun.jna.Native; public class JNA_PSAPI_Test_optimized { public static native boolean Get

有没有一种方法可以监视Java中内存的非分页池区域?
我发现的唯一一个只能读取正在使用的内存总量,而不能读取内存的特定区域。

我决定使用并调用它来解决这个问题。调用命令行可能代价高昂,而且非常难看,因为我需要每秒检查正在运行的进程和非页面工具。
幸运的是,用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调用此操作。