如何在Windows 7中监视大内存页面的JVM使用情况?

2022-09-04 04:53:15

我正在尝试测量在Windows 7 HotSpot JVM中使用大内存页面的性能提升。为此,我需要监视 JVM 内存使用情况,以确保实际利用大页面。不幸的是,我找不到实现这一目标。以下是我完成的设置和试验的说明:

环境设置

我正在使用 64 位 Windows 7 终极版进行测试。“锁定内存中的页”Windows 安全策略已启用,如 Java 对大内存页的支持中所述。我还验证了通过运行java版本命令启用了大页面功能,如下所示:

java -XX:+UseLargePages -version

我得到以下结果,这些结果专门用于启用大页面功能:

java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)

我在所有试用版中使用了此视频中的示例 Java 程序来消耗可用于 java 堆的所有内存:

public class InfinteStringHashmap {
public static void main(String[] args) throws Exception{
    Map<Long, String> map = new HashMap<Long, String>();

    for(long i=1; true; i++){
        StringBuilder sb = new StringBuilder();
        for(long j=0;j<i;j++) sb.append(" ");
        map.put(i, sb.toString());

        if(i % 1000 == 0){
            System.out.print(".");
            Thread.sleep(1000);
        }
    }
  }
}

我使用以下命令运行此示例程序(例如,固定堆大小为512m):

java -Xms512m -Xmx512m -XX:+UseLargePages InfinteStringHashmap

我还尝试了其他堆大小,小至12MB,大至10GB。请注意,我在重新启动计算机后立即运行测试应用程序,以确保我的可用RAM内存没有碎片。

监视内存的试验失败

为了验证是否使用了大内存页,我尝试了:

  1. 来自Windows SystInternals的RamMap工具,该工具具有用于大页面的特定字段。无论我如何更改堆大小,它都不会显示大内存页的使用情况。为了验证这一点,我尝试从 MSDN 中创建“使用大页面创建文件映射”示例,以缩小可能性。它工作得很好(它从insied代码中打印了2MB的页面大小)。RamMap工具不显示任何内容。
  2. 使用本文中建议的代码打印 Java 进程使用的页面大小。它始终打印 4096(Windows 上的默认页面大小)。为了验证它,我尝试了Linux版本的Hotspot JVM上的大页面,如本视频中所述,它有效。但是,打印页面大小不起作用(它一直打印4096)。
  3. Vadump 工具,显示有关特定进程的虚拟内存统计信息。“-o”选项应该显示进程使用的VM类型,使用的页面数以及每种类型占用的总大小,可用于推断是否使用了大页面。不幸的是,当我设置JVM UseLargePages选项时,此命令失败,错误代码为24。
  4. VmMap 工具不会更新查找的内存列。
  5. 像TaskManager和Perfmon这样的简单监视工具不会提供有关大页面的详细信息。

编辑:我尝试了评论中建议的以下工具:

  1. Java 任务控制器:不提供页面大小信息。

  2. 进程资源管理器:同上

是否有测量进程的页面大小或监视Windows中大内存页面的使用情况?


答案 1

我认为你的测试方法不合适。当您想要优化 TLB 时,请使用大内存页:

A Translation-Lookaside Buffer (TLB) is a page translation cache that holds the most-recently used virtual-to-physical address translations. TLB is a scarce system resource. A TLB miss can be costly as the processor must then read from the hierarchical page table, which may require multiple memory accesses. By using bigger page size, a single TLB entry can represent larger memory range. There will be less pressure on TLB and memory-intensive applications may have better performance.

您可以使用 [JVisualVM] 来分析您的应用程序。但是如果你的测试,你创造了新的对象。我不是这里的专家,但为了mz对TBL的理解,您应该将数据从内存加载到应该在缓冲区中的结构中。如果没有,我应该加载。

从理论上讲,测量恒定操作次数的时间的测试应该足以看到 VM 参数的影响。


答案 2

我不确定这是否是你要找的。
但是procexp(Process Explorer)可能会有所帮助。这没什么特别的。只是一个更花哨的Windows 7任务管理器。

此外,随着Java JDK的后续下载,有一种叫做Java Mission Control的东西。

祝你好运!