跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

驯服 Tiger: 虚拟机更新

为加快启动时间、降低内存需求而设计的修改

John Zukowski (jaz@zukowski.net), 总裁, JZ Ventures, Inc.
John Zukowski's Photo
John Zukowski 为 JZ Ventures, Inc.提供战略性 Java 咨询,并与 SavaJe Technologies合作开发下一代移动电话平台。他的最新著作有 Mastering Java 2, J2SE 1.4 (Sybex,2002 年 4 月)和 Learn Java with JBuilder 6 (Apress,2002 年 3 月)。可以通过 jaz@zukowski.net 与他联系。

简介: 在驯服 Tiger 的这一期中,John Zukowski 介绍了最新的 Java 虚拟机如何改善启动时间、降低内存需求、提高性能。Tiger 提供了共享的数据档案文件、新的线程调度算法以及致命错误处理器(用来处理故障)。请在本文附带的 讨论论坛 上与作者和其他读者分享您对本文的想法。(也可以单击本文顶部或底部的 讨论 访问讨论论坛。)

发布日期: 2005 年 3 月 28 日
级别: 初级
访问情况 : 1078 次浏览
评论: 


Java 平台的每个发行版都包含一些为改善启动时间、降低内存需求而设计的修改。这不是老调重谈,而是必需的,因为每个新的发布,都会带来一个更大、更广阔的平台。 5.0 发行版也不例外。这个月将介绍这些附加内容。

致命错误处理器

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 —— 得到进程 ID
  • jstat —— 得到进程 ID 的统计值(jstat -gc pid
  • jinfo —— 得到 JVM 的配置信息
  • jmap —— 打印库的内存映射
  • jstack pid | core —— 生成堆栈跟踪

类数据共享

为了帮助改善启动时间,JVM 现在和内存映射文件一起工作。这些文件在安装时创建,保存着系统类的内部表示方式。这样,在启动 JVM 时,就不会从头开始装入系统类,而是装入内存映射文件。这在两个方面提供了帮助。首先,差不多有一半内存映射文件是只读的,这意味着可以在多个并发运行的进程之间共享它们,从而在相当程度上减少了启动时间和需要的全部内存。其次,由于这些文件采用了 Java HotSpot 虚拟机能够使用的格式,所以永远不会发生需要内存来处理原始类文件的情况,这也改善了启动时间。

共享档案文件的位置依赖于平台。文件命名为 classes.jsa,其中 JSA 扩展代表 Java 共享档案(Java Shared Archive)。在 Microsoft Windows 平台上,可以在 jre\bin\client 中找到共享档案。在 Linux 平台上,位置是 jre/lib/[arch]/client。所有这些位置都基于 JAVA_HOME 根。

如果不喜欢这个文件,可以删除它。实际上,如果想重新生成这个文件,就必须删除它。请用 -Xshare:dump 命令行开关调用 java 命令来生成它。在执行的时候,可以得到类似清单 2 所示的输出 :


清单 2. 重新生成共享数据文件的命令输出
				
  Loading classes to share ... done.
  Rewriting and unlinking classes ... done.
  Calculating hash values for String objects .. done.
  Calculating fingerprints ... done.
  Removing unshareable information ... done.
  Moving most read-only objects to shared space at 0x2aad0000 ... done.
  Moving common symbols to shared space at 0x2ae2e848 ... done.
  Moving remaining symbols to shared space at 0x2af51148 ... done.
  Moving string char arrays to shared space at 0x2af51bd8 ... done.
  Moving additional symbols to shared space at 0x2afd2ef0 ... done.
  Read-only space ends at 0x2b027960, 5601632 bytes.
  Moving read-write objects to shared space at 0x2b2d0000 ... done.
  Moving String objects to shared space at 0x2b825be8 ... done.
  Read-write space ends at 0x2b8643a8, 5850024 bytes.
  Updating references to shared objects ... done.

如果不喜欢拥有共享的文件,可以不用它。可以用 -Xshare:off 选项禁止共享。然后,会从 rt.jar 文件装入所有的原始类信息。

为确保允许使用共享数据文件,请使用 -Xshare:on 选项。默认情况下并没有打开它的使用。相反,-Xshare:auto 选项是默认值。auto 选项意味着如果可能的话,应当用共享文件。如果文件不可用(例如,文件已经删除),就会忽略该选项。

如果手动地控制共享类数据文件的使用,那么请当心命令行选项在未来的发行版中可能会变化 —— 至少它的文档是这么说的。

Sun 声称在启用的时候,启动时间大约改善了 30 %。


Solaris 线程优先级

Java Thread 类包含一个 setPriority() 方法,有助于为创建的线程分配一个优先级。关于 setPriority() 方法需要了解的关键是:它的设置可以被忽略。而且,不同的平台有不同的线程调度模型,所以会产生不同的结果。

在 5.0 发行版中,针对 Solaris 平台的线程优先级实现方式做了一些修改,返回到一种更原始的行为上。因此,从 10 个逻辑的 Java 优先级(从 Thread.MIN_PRIORITYThread.MAX_PRIORITY)到本机优先级的映射是不同的:

  • Java 优先级范围在 5 到 10 之间的线程被映射为高
  • Java 优先级范围在 1 到 4 之间的线程被映射为低

就是这么简单 —— 如果觉得优先级更少就会更简单的话。这个变化背后的理由是:为了保证 Java 线程可以被调度成按照与本机线程和进程相同的优先级运行。但是这就意味着在 5 到 10 之间的 Java 优先级处理起来没有差别。(有关这个变化的更多信息,请参阅 参考资料 小节中的 “Thread Priority on the Solaris Platform”)。

如果是在 Linux 或 Microsoft Windows 平台上,那么可以忽略这个变化。但是,如果用户是在 Solaris 平台上,那么还是应当注意这个差别。


服务器类别探测

默认情况下,除非使用的是 64 位芯片(它默认使用服务器虚拟机),否则 JVM 启动时用的是客户端 HotSpot 虚拟机。可以使用 -server 命令行选项强制启用服务器 HotSpot 虚拟机。如果使用的是 32 位的 Solaris SPARC 机或者 Linux/Solaris i586 系统,而且没有指定 -client-server 选项,那么虚拟机会自动检测要使用哪个版本。Microsoft Windows 默认采用客户端虚拟机。

在使用自动探测时,如果一台机器拥有至少两个 CPU 和 2GB 物理内存,就会把它当成服务器。如果不介意较慢的启动时间,在没有最近出现的共享内存时,服务器虚拟机运行一段时间会变快。


垃圾收集

如果确实在运行服务器虚拟机,或者至少是在服务器级别的机器上,那么默认的垃圾收集器就会从老式的串行版本(-XX:+UseSerialGC)变成新式的并行收集器(-XX:+UseParallelGC)。其他与堆尺寸和时间限制有关的默认设置也发生了变化(请参阅 参考资料 一节中的“Garbage Collector Ergonomics”,获得与这些设置有关的附加信息。)


结束语

我们完成了这个技巧,同时又回到起点。随着每个 Java 的发行版,事情都会有些变化。虚拟机的配置有了新的、不同的选项,承诺会有更快的启动、更小的内存开销。J2SE 平台的 5.0 发行版也遵循这个模式。


参考资料

关于作者

John Zukowski's Photo

John Zukowski 为 JZ Ventures, Inc.提供战略性 Java 咨询,并与 SavaJe Technologies合作开发下一代移动电话平台。他的最新著作有 Mastering Java 2, J2SE 1.4 (Sybex,2002 年 4 月)和 Learn Java with JBuilder 6 (Apress,2002 年 3 月)。可以通过 jaz@zukowski.net 与他联系。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Java technology
ArticleID=58292
ArticleTitle=驯服 Tiger: 虚拟机更新
publish-date=03282005
author1-email=jaz@zukowski.net
author1-email-cc=

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。