如何监控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. 进程地址空间中的虚拟页到物理页帧的映射