gpt4 book ai didi

java - 如何监控Windows 7中大内存页的JVM使用情况?

转载 作者:搜寻专家 更新时间:2023-10-30 19:47:26 25 4
gpt4 key购买 nike

我正在尝试测量在 Windows 7 HotSpot JVM 中使用大内存页的性能增益。为此,我需要监控 JVM 内存使用情况以确保大页面得到实际利用。不幸的是,我无法找到实现这一目标的方法。以下是我所做的设置和试验的描述:

环境设置

我使用 64 位 Windows 7 终极版进行测试。 “在内存中锁定页面”Windows 安全策略已启用,如 Java Support for Large Memory Pages 中所述.我还通过如下运行 java version 命令验证了大页面功能是否已启用:

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)

我使用了来自 this video 的示例 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 内存没有碎片。

监控内存的失败尝试

为了验证是否使用了Large Memory Pages,我尝试了:

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

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

  1. Java Mission Controller:不提供页面大小信息。

  2. Process Explorer:同上

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

最佳答案

我认为你的测试方法不合适。当您想要优化 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] 来分析您的应用程序。但是在测试的情况下,您会创建新对象。我不是这里的专家,但为了理解 TBL,您应该将数据从内存加载到应该在缓冲区中的结构。如果不存在,我应该加载。

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

关于java - 如何监控Windows 7中大内存页的JVM使用情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24292771/

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