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

时间:2014-06-18 18:35:25

标签: java windows memory-management

我正在尝试衡量在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内存不会碎片化。

监控记忆的试验失败

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

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

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

    2. Process Explorer:与上述相同

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

3 个答案:

答案 0 :(得分: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]来分析您的应用程序。但是在测试的情况下,您可以创建新对象。我不是这里的专家,但是为了理解TBL,你应该将数据从内存加载到应该在缓冲区中的结构。如果不存在我应该加载。

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

答案 1 :(得分:0)

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

此外,随着Java JDK的后续下载,还有一些名为Java Mission Control的内容。

祝你好运!

答案 2 :(得分:0)

LMP似乎是特定分配的一个特征,而不是整个过程的一个特征(http://msdn.microsoft.com/en-us/library/windows/desktop/aa366720(v=vs.85).aspx)。跟踪使用哪种分配以及哪些不使用LMP可能不可行。

更新:尝试将系统调用监视器附加到您的进程。您可以查看是否使用正确的参数调用VirtualAlloc。