首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Memory Analyzer(及其 IBM Extensions 插件)为何不再只用于内存泄露(1)数据

Memory Analyzer(及其 IBM Extensions 插件)为何不再只用于内存泄露(1)数据

从转储进行调试在一篇关于  的 IBM developerWorks 配套文章中,我们介绍了这样一个概念:使用 IBM Monitoring and Diagnostics for Java - Memory Analyzer 工具(以下简称 Memory Analyzer),结合来自一个基于 HotSpot 的 Java 运行时(Solaris™ 和 HP-UX)的 HPROF 二进制转储或来自一个 IBM Java 运行时的系统转储,来调试问题而非内存泄露。那篇文章介绍了使用那些转储类型(而不是 IBM Portable Heap Dump)的重要性,如何获取转储,以及如何使用转储诊断几种问题类型,包括足迹和内存效率问题、类加载器层级问题、线程数据使用情况、以及异常分析。
本文介绍如何在 IBM WebSphere Application Server 中生成并启用 HPROF 和 IBM 系统转储,如何使用 Memory Analyzer 和新近可用的 IBM Extensions for Memory                Analyzer 插件帮助理解您的 WebSphere                Application Server 环境的状态并诊断一些 WebSphere Application Server 特有问题。
在 WebSphere Application Server 中生成转储要利用 Memory Analyzer 的全部威力,重要的是生成 HPROF 格式转储(如果使用基于 HotSpot 的 Java 运行时)或 IBM 系统转储(如果使用基于 IBM 的 Java 运行时)。这是因为那些转储格式包含一些额外数据,那些数据存储在堆上的 Java 对象中,对于诊断内存泄露之外的问题和创建应用程序状态报告很重要。
尽管 HPROF 和 IBM 系统转储格式包含重要的额外数据,但它们的代价是需要额外的磁盘空间。两种系统转储类型都大于它们表示的 Java 堆的大小,IBM 系统转储等于 Java 进程的总内存大小。这意味着,确保有足够的磁盘空间、防止转储被截断很重要。默认情况下,转储被写入 Java 进程的当前工作目录。在 WebSphere Application Server 中,这是服务器的配置文件目录的路径;例如,WebSphere_Application_Server_Install_Path/profiles/node1。对于 IBM Java 运行时,可以使用 -Xdump 文件命令行选项更改这个位置。对于 HotSpot Java 运行时,使用的是 -XX:HeapDumpPath 命令行选项。
生成系统转储时,还有一点很重要:确保设置了必要的操作系统级设置来支持写入完整的转储。在基于 UNIX® 的系统上,这意味着设置了正确的 ulimits。(参见 参考资料,了解如何从 AIX®、Linux®、z/OS® 和 Solaris 获取系统转储。)
从 HotSpot Java 运行时生成转储基于 HotSpot 的 Java 运行时只生成 HPROF 格式转储,可以在 OutOfMemoryError 发生时生成,也可以使用下面几种交互式方法生成:
  • 交互式方法
    • 使用一个 Ctrl+Break:如果为正在运行的应用程序设置了 -XX:+HeapDumpOnCtrlBreak 命令行选项,那么当一个 Ctrl+Break 事件或 SIGQUIT(通常使用 kill -3 生成)通过控制台发送时,将生成一个 HPROF 格式转储和一个线程转储。有些版本上可能没有这个选项,如果遇到这种情况,可以尝试以下命令:                        -Xrunhprof:format=b,file=heapdump.hprof
    • 使用 jmap 工具:这个 JDK 的 bin 目录中提供了一个 jmap 实用工具(参见 ),该工具提供一个选项来从正在运行的进程请求 HPROF 转储。对于 Java 5,使用下面的命令:        jmap -dump:format=b pid
      对于 Java 6,使用下面的命令,其中,“live” 是可选选项,导致只将 “活动” 对象写入转储文件进程 ID(PID):jmap -dump[live,]format=b,file=filename pid
    • 使用操作系统:使用非破坏性的 gcore 命令或破坏性的 kill -6 或 kill -11 命令来生成一个核心文件。然后,通过使用 jmap 指向核心转储,从核心文件提取一个堆转储:                            jmap -dump:format=b,file=heap.hprof                                path
    • 使用 JConsole 工具:JConsole 中的 HotSpotDiagnostic MBean 下方提供了一个 dumpHeap 操作。这个操作请求生成一个 HPROF 堆。
  • 基于事件的方法 如果为正在运行的应用程序设置了 -XX:+HeapDumpOnCtrlBreak 命令行选项,那么当 OutOfMemoryError 发生时,将生成一个 HPROF 格式转储。这种方法对于生产系统很理想,因为生产系统几乎总是需要诊断内存问题,并且这不会引发任何实时性能开销。这对于每次 JVM 运行时这个事件上生成的堆转储的数量没有限制;在一些较新的发布中,每次 JVM 运行时这个事件上生成的堆转储数量限制为 1。
为您生产中的任何 WebSphere Application Server 部署设置 -XX:+HeapDumpOnOutOfMemoryError 命令行选项是一个好主意。
从 WebSphere Application Server 生成转储IBM Java 运行时提供一些转储和跟踪引擎,可用于在大量交互式和基于事件的场景中生成 PHD 格式转储或系统转储。也可以使用 Health Center 工具或使用一个 Java API 以编程方式生成交互式转储:
  • 交互式方法
    • 使用一个 SIGQUIT 或 Ctrl+Break:当一个 Ctrl+Break 或 SIGQUIT(通常使用 kill -3生成)被发送到 IBM 运行时,一个用户事件将在 IBM 转储引擎中生成。默认情况下,这个事件只生成一个线程转储文件(javacore.txt)。您可以使用 -Xdump:heap:events=user 选项生成一个 PHD 格式转储,或使用 -Xdump:system:events=user 选项生成一个 Java 应用程序系统转储。
    • 使用操作系统生成一个系统转储:
      • AIX:gencore(或破坏性的 kill -6 or kill -11)
      • Linux/Solaris:gcore(或破坏性的 kill -6 or kill -11)
      • Windows:userdump.exe
      • z/OS:SVCDUMP 或控制台转储
    • 使用 IBM Monitoring and Diagnostics Tools for Java -                            Health Center:Health Center 工具提供一个菜单选项来从一个正在运行的 Java 进程请求一个 PHD 转储或系统转储(参见 )。
    • 使用 wsadmin 脚本客户端:下面的命令使用 Jython 和 -lang                              jython 选项(参见  了解关于连接 wsadmin 并引用目标进程的细节):
      • 线程转储:AdminControl.invoke(AdminControl.completeObjectName("type=JVM,process=server1,*"),                              "dumpThreads")
      • 系统转储:AdminControl.invoke(AdminControl.completeObjectName("type=JVM,process=server1,*"),                              "generateSystemDump")
      • 可移植堆转储(PHD):AdminControl.invoke(AdminControl.completeObjectName("type=JVM,process=server1,*"),                              "generateHeapDump")
        单个 JVM 运行达到 10 个堆转储后,此命令将抛出 HeapDumpOnDiskLimitReachedException(这只适用这个 JMX 命令)。使用下面的命令提高这个限制(这个设置在重启后将失效):
        AdminControl.invoke(AdminControl.completeObjectName("type=JVM,process=server1,*"),                                  "setMaxDumpsOnDisk", "20")
  • 基于事件的方法IBM 转储和跟踪引擎提供一个灵活的功能集,在大量事件上生成 PHD 和系统转储,比如正在抛出的异常和正在执行的方法。使用这些功能,应该能够为您想要诊断的大多数问题场景生成转储:
    • 使用 IBM 转储引擎:这个转储引擎提供许多事件,可以在那些事件上生成 PHD 或系统转储;这个引擎还允许过滤那些事件的类型,对何时生成转储提供细粒度控制。这是 OutOfMemoryError 上最常用的设置(在应用程序服务器的泛型 JVM 参数中设置):            -Xdump:heap:none -Xdump:java+system:events=systhrow,filter=java/lang/OutOfMemoryError,range=1..4,request=exclusive+compact+prepwalk
      当 OutOfMemoryError 发生时,这个命令生成一个 IBM 系统转储(和一个线程转储)而不是可移植堆转储。应该为所有生产 WebSphere Application Server 部署设置下面的 -Xdump 命令行选项:
      -Xdump:heap:none            -Xdump:java+system:events=systhrow,filter=java/lang/OutOfMemoryError,range=1..4,request=exclusive+compact+prepwalk
返回列表