如何监控Java应用程序的Windows内存使用情况 - 编程入门网
如何监控Java应用程序的Windows内存使用情况时间:2011-04-16 IBM Emma ShepherdJava 技术最知名的一个优点是:与其他语言如 C 程序员不同,Java 程序员不需要对令 人畏惧的内存分配和释放负责。Java 运行库可以为您管理这些任务。每个实例化的对象都自 动在堆中分配内存,垃圾收集程序定期收回不再使用的对象所占据的内存。但是您还不能完 全撒手不管。您仍然需要监控程序的内存使用情况,因为 Java 进程的内存不仅仅包括堆中 分配的对象。它还包括程序的字节码(JVM 在运行时解释执行的指令)、JIT 代码(已经为 目标处理器编译过的代码)、任何本机代码和 JVM 使用的一些元数据(异常表、行号表等等 )。情况更为复杂的是,某些类型的内存(如本机库)可以在进程间共享,因此确定 Java 应用程序的内存占用可能是一项非常艰巨的任务。 有大量在 Windows 监控内存使用的工具,但不幸的是没有一种能够提供您需要的所有信 息。更糟的是,这些形形色色的工具甚至没有一个公共的词汇表。但本文会助您一臂之力, 文中将介绍一些最有用的、可免费获得的工具,并提供了如何使用它们的技巧。 Windows 内存:一次旋风般的旅行 了解本文要讨论的工具之前,需要对 Windows 如何管理内存有基本的理解。Windows 使 用一种 分页请求虚拟内存系统,现在我们就来分析一下这种系统。 虚拟地址空间 虚拟内存的概念在上个世纪五十年代就提出了,当时是作为解决不能一次装入实际内存的 程序这一复杂问题的方案提出的。在虚拟内存系统中,程序可以访问超出可用物理内存的更 大的地址集合,专用内存管理程序将这些逻辑地址映射到实际地址,使用磁盘上的临时存储 保存超出的部分。 Windows 所使用的现代虚拟内存实现中,虚拟存储被组织成大小相同的单位,称为 页。 每个操作系统进程占用自己的 虚拟地址空间,即一组可以读写的虚拟内存页。每个页可以有 三种状态: 自由:还没有进程使用这部分地址空间。如果企图访问这部分空间,无论读写都会造成某 种运行时失效。该操作将导致弹出一个 Windows 对话框,提示出现了访问冲突。(Java 程 序不会造成这种错误,只有用支持指针的语言编写的程序才可能造成这种问题。) 保留:这部分地址空间保留给进程,以供将来使用,但是在交付之前,不能访问该地址空 间。很多 Java 堆在一开始处于保留状态。 提交:程序可以访问的内存,得到了完全 支持,就是说已经在分页文件中分配了页帧。 提交的页只有在第一次被引用时才装入主存,因此成为 请求式分页。 图 1 说明了进程地址空间中的虚拟页如何映射到内存中的物理页帧。 图 1. 进程地址空间中的虚拟页到物理页帧的映射 如何监控Java应用程序的Windows内存使用情况(2)时间:2011-04-16 IBM Emma Shepherd如果运行的是 32 位机器(如一般的 Intel 处理器),那么进程的整个虚拟地址空间就 是 4GB,因为这是用 32 位所能寻址的最大地址空间。Windows 通常不会允许您访问地址空 间中的所有这些内存,进程自己使用的只有不到一半,其他供 Windows 使用。这 2 GB 的私 有空间部分包含了 JVM 执行程序所需要的多数内存:Java 堆、JVM 本身的 C 堆、用于程序 线程的栈、保存字节码和即时编译方法的内存、本机方法所分配的内存等等。后面介绍地址 空间映射时,我们将描述这些不同的部分。 希望分配了大量连续内存区域但这些内存不马上同时使用的程序常常结合使用保留内存和 提交内存。JVM 以这种方式分配 Java 堆。参数 -mx 告诉 JVM 堆有多大,但 JVM 通常不在 一开始就分配所有这些内存。它 保留 -mx 所规定的大小,标记能够提交的整个地址范围。 然后它仅仅提交一部分内存,这也是内存管理程序需要在实际内存和分页文件中分配页来支 持 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |