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