首页 / 软件开发 / JAVA / 驯服Tiger: 虚拟机更新
驯服Tiger: 虚拟机更新2011-01-31 IBM John Zukowski在驯服 Tiger 的这一期中,John Zukowski 介绍了最新的 Java 虚拟机如何改善启动时间、降低内存需求、提高性能。Tiger 提供了共享的数据档案文件、新的线程调度算法以及致命错误处理器(用来处理故障)。请在本文附带的 讨论论坛 上与作者和其他读者分享您对本文的想法。(也可以单击本文顶部或底部的 讨论 访问讨论论坛。)致命错误处理器JVM 包含几个新的命令行选项。其中一个不太标准的选项是“致命错误处理器”。用 -XX:OnError 选项启动 JVM,可以指定在发生错误和 JVM 有故障时要执行的命令。清单 1 显示了几个这样的选项:清单 1. 一些 OnError 处理选项-XX:OnError="gcore %p; dbx - %p"
-XX:OnError="gdb %p"
-XX:OnError="pmap %p"JVM 中发生致命错误时,就会执行引号中的命令。%p 选项用进程 ID 替换。想故意制造些错误并不容易,但是如果偶然发现某种情况确实重复发生,那么通过处理器得到的信息是极有帮助的。OnError 选项使用 Java 调试接口(Java Debug Interface,JDI) 服务性代理连接器桥(serviceability agent connector bridge)。有了这个桥,就能够连接核心文件或者已经安装的虚拟机,以及其他任务。如下所示,随 JDK 提供了几个诊断工具,它们利用了这个桥,但是最后三个工具在 Microsoft Windows 平台上不能用:jps —— 得到进程 IDjstat —— 得到进程 ID 的统计值(jstat -gc pid)jinfo —— 得到 JVM 的配置信息jmap —— 打印库的内存映射jstack pid | core —— 生成堆栈跟踪类数据共享为了帮助改善启动时间,JVM 现在和内存映射文件一起工作。这些文件在安装时创建,保存着系统类的内部表示方式。这样,在启动 JVM 时,就不会从头开始装入系统类,而是装入内存映射文件。这在两个方面提供了帮助。首先,差不多有一半内存映射文件是只读的,这意味着可以在多个并发运行的进程之间共享它们,从而在相当程度上减少了启动时间和需要的全部内存。其次,由于这些文件采用了 Java HotSpot 虚拟机能够使用的格式,所以永远不会发生需要内存来处理原始类文件的情况,这也改善了启动时间。共享档案文件的位置依赖于平台。文件命名为 classes.jsa,其中 JSA 扩展代表 Java 共享档案(Java Shared Archive)。在 Microsoft Windows 平台上,可以在 jreinclient 中找到共享档案。在 Linux 平台上,位置是 jre/lib/[arch]/client。所有这些位置都基于 JAVA_HOME 根。