免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1211 | 回复: 0
打印 上一主题 下一主题

驯服 Tiger: 虚拟机更新 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-04-07 19:32 |只看该作者 |倒序浏览
转自IBM官方网站java技术区
John Zukowski

jaz@zukowski.net

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

jaz@zukowski.net

总裁, JZ Ventures, Inc.
2005 年 3 月wwwwww
在驯服 Tiger 的这一期中,John Zukowski 介绍了最新的 Java 虚拟机如何改善启动时间、降低内存需求、提高性能。Tiger 提供了共享的数据档案文件、新的线程调度算法以及致命错误处理器(用来处理故障)。请在本文附带的
讨论论坛
上与作者和其他读者分享您对本文的想法。(也可以单击本文顶部或底部的 讨论 访问讨论论坛。)
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 平台上,可以在 jreinclient 中找到共享档案。在 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_PRIORITY 到 Thread.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 负责
    JZ Ventures, Inc.
    公司的战略 Java 咨询,与
    SavaJe Technologies
    一起开发下一代移动电话平台。他的新书是
    Mastering Java 2, J2SE 1.4
    (Sybex,2002 年 4 月)和
    Learn Java with JBuilder 6
    (Apress,2003 年 3 月)。请通过
    [email=jaz@zukowski.net?Subject=Taming the Tiger]jaz@zukowski.net[/email]
    与他联系。

    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/5576/showart_20132.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP