【问题标题】:Java programm on 32 bit jvm slower than on 64 bit32 位 jvm 上的 Java 程序比 64 位慢
【发布时间】:2018-10-25 01:23:45
【问题描述】:

我目前的 Java 程序出现了奇怪的行为:
该程序是一个 JavaFX 桌面应用程序,它使用本地 Selenium 独立服务器打开 WebApp、进行一些输入并下载 Excel 文件。它读取 Excel 文件并将其与另一个 Excel 表进行比较并标记差异。

它正在工作,我面临的问题是,生成的 JAR 运行速度比我从 Eclipse 启动项目时慢。唯一显着的性能差异是当我将 Excel 表格与 Apache POI 进行比较时。

我将问题缩小到 JRE - 如果我启动 Jar,它使用 32 位 JRE 如果我从 Eclipse 启动它使用 64 位 JDK。
我用 JConsole 监控了这两个进程,32 位的 Jar 几乎使用了 20 分钟,而 64 位只需要大约 30 秒。

Apache Poi 在 32 位系统上是否有任何问题?或者您有什么想法和建议,我可以如何更好地监控并找到显着性能的瓶颈?

【问题讨论】:

  • 将-DXmx=512m 的内存设置为合理的值。
  • 我不相信仅仅因为 32 位和 64 位,差异会如此之大。尝试查看虚拟机设置。
  • @JoopEggen 不应该是-Xmx吗?我一直用-Xmx,从来没有新的你可以做-DXmx...
  • @Itai 当然
  • @JoopEggen 我做了,但仍然没有区别,即使内存更多,当我使用 32 位环境时,执行时间也会更长

标签: java performance apache-poi 32bit-64bit


【解决方案1】:

尝试使用Java Mission Control 和Flight Recorder 代替JConsole 来收集性能指标。这应该可以帮助您了解瓶颈在哪里,例如CPU 与网络。最常见的性能问题是堆内存不足和垃圾收集器难以释放它(例如频繁的 OldSpace 完整 GC 周期)。

检查许可证以查看您是否可以使用它,据我所知,它在开发、非生产环境中是免费的,但最近由于该工具是开源的,许可证发生了变化。

【讨论】:

  • 我查看了 Java Mission Control 和 Flight Recorder,当我使用 32 位 jvm 时,垃圾收集器的工作似乎更慢且更频繁。垃圾收集器在 32 位上需要 4s60ms,在 64 位上只需要 17ms912µs。但仍然存在 ~15 分钟的性能/时间差异
  • 比较堆大小,特别注意查看NewSize。 Code 选项卡中应该有更多统计信息,也许采样分析器会告诉您时间花费在哪里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 2012-03-19
  • 2013-07-27
  • 2011-05-13
  • 2012-09-19
  • 2011-12-25
  • 2018-03-23
相关资源
最近更新 更多