【问题标题】:Updating from Java 1.4.2 to Java 6 (both Sun VMs) results in slower performance从 Java 1.4.2 更新到 Java 6(都是 Sun VM)会导致性能下降
【发布时间】:2008-12-12 11:24:27
【问题描述】:

我刚刚将一些在 Sun Java 1.4.2 VM 上运行的旧 Java 源升级到 Sun Java (JRE) 6 VM。或多或少我唯一需要改变的是为一些抽象对象(Hashmap's、Vector's 等)添加显式数据类型。代码本身非常占用内存,最多使用 1G 的堆内存(使用 -Xmx1024m 作为启动 VM 的参数)。

由于我阅读了很多关于在较新的 Java VM 上性能更好的文章,这就是我进行此升级的原因之一。

  1. 谁能想到我现在的情况下性能更差的原因(当然,只是一般情况下,因为您无法查看代码)?
  2. 如果我想优化(速度方面)现有代码,有没有人给非 Java 专家一些建议?有任何提示、推荐的文档、工具吗?

谢谢。

【问题讨论】:

  • 我怀疑这真的会影响任何事情,但是当你不需要它的内置同步/线程安全性时使用 Vector 可能是矫枉过正
  • 您是否尝试过在 Java 6 上运行原始的纯正 1.4.2 编译代码?您可能想要选择特定的垃圾收集器。也可能使用 -d32 来确保您没有为指针使用太多内存。

标签: java performance jvm sun


【解决方案1】:

这里没有太多信息。但这里有几件事您可能想要探索:

  • 使用 Xmx 和 Xms 作为相同值(在您的情况下为 1024M)启动 VM

  • 确保正在使用服务器 jvm dll 来启动虚拟机。

  • 运行分析器以查看哪些对象占用了内存或哪些对象没有被垃圾回收

  • 使用 jconsole 连接您的 VM 并跟踪对象

【讨论】:

  • 在 Windows 机器(甚至是“服务器”类机器)上默认不选择服务器热点 VM,所以这是一个很好的提示。
【解决方案2】:

如果您的应用程序几乎耗尽可用空间,垃圾收集时间可能会支配计算时间。

启用 gc 调试以查找此内容。或者,更好的是,只需启动 jconsole 并将其附加到您的程序中。

【讨论】:

    【解决方案3】:

    理论上,您的应用程序可能会消耗更多内存,因为字符串共享其内部 char[] 的方式发生了变化。 1.4 后共享较少。 查看我的旧博客http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/5100(新博客是here

    我会比较垃圾收集器日志,看看内存使用是否真的是问题所在。

    如果这没有帮助,我们可以使用 Yourkit 之类的分析器来找出差异。

    【讨论】:

      【解决方案4】:

      一定要在应用程序上使用分析器(YourKit 很棒)...很容易浪费大量时间来猜测问题,因为大多数时候你可以在分析器中快速缩小范围。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-17
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多