当前位置: 首页 > 知识库问答 >
问题:

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

姚麒
2023-03-14

我正在尝试衡量在Windows7HotSpotJVM中使用大内存页面的性能提升。为了做到这一点,我需要监视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内存没有碎片。

监控记忆的试验失败

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

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

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

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

流程浏览器:同上

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

共有3个答案

公冶弘壮
2023-03-14

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

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

宋晋
2023-03-14

我不确定这是否是你要找的。
但是,进程资源管理器(进程资源管理器)可能会有所帮助。这并不是什么特别的事情。只是一个更花哨的任务管理器为视窗 7.

此外,随着Java JDK的后续下载,还有一种称为Java任务控制的东西。

祝你好运

臧威
2023-03-14

我认为你的测试方法不合适。当您想优化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参数的影响。

 类似资料:
  • 本文向大家介绍详解JVM 运行时内存使用情况监控,包括了详解JVM 运行时内存使用情况监控的使用技巧和注意事项,需要的朋友参考一下 java 语言, 开发者不能直接控制程序运行内存, 对象的创建都是由类加载器一步步解析, 执行与生成与内存区域中的; 并且jvm有自己的垃圾回收器对内存区域管理, 回收; 但是我们已经可以通过一些工具来在程序运行时查看对应的jvm内存使用情况, 帮助更好的分析与优化我

  • 我正在Apache NiFi中创建内存监控报告任务,以监控JVM的使用情况。但是我不知道哪个内存池适合监控JVM的使用情况。任何建议都将不胜感激。 可用内存池: > < li> 代码缓存 元空间 压缩类空间 G1 伊甸园空间 G1幸存者空间 G1老一代 据我所知,G1 Eden Space,G1 Survivor Space和G1 Old Gen是年轻一代的内存池,所以这三个用于监控java堆空间

  • 我们通常处理OutOfMemoryError问题是因为堆或permgen大小配置问题。 但所有JVM内存都不是permgen或heap。据我理解,它还可以与线程/堆栈、原生JVM代码... 但是使用pmap我可以看到进程分配了9.3G,这是3.3G的离堆内存使用量。 我想知道有什么可能性来监视和调优这种额外的离堆内存消耗。 我不使用直接离堆内存访问(MaxDirectMemorySize是64M默

  • 问题内容: 如何监视Node.js的内存使用情况? 问题答案: node-memwatch:检测并查找Node.JS代码中的内存泄漏。查看本教程,以跟踪Node.js中的内存泄漏

  • 如何监视Node.js的内存使用情况?

  • 我有一个Tomcat webapp,它代表客户端执行一些相当大的内存和CPU密集型任务。这是正常的,也是所需的功能。但是,当我运行Tomcat时,内存使用量会随着时间的推移而猛增,达到4.0GB以上,这时我通常会关闭该进程,因为它会扰乱我开发机器上运行的其他所有内容: 我以为我的代码无意中引入了内存泄漏,但在使用VisualVM检查它之后,我看到了一个不同的情况: VisualVM显示该堆占用大约