我正在尝试衡量在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内存不会碎片化。
监控记忆的试验失败
为了验证是否使用了大内存页面,我尝试了:
修改:我尝试了评论中建议的以下工具:
Java Mission Controller:不提供页面大小信息。
Process Explorer:与上述相同
是否可以测量进程的页面大小或监视Windows中大内存页面的使用情况?
答案 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。