小编rod*_*ded的帖子

从jdk1.7.0_25迁移到jdk1.7.0_40时的性能回归

我正在将Spring 3.1.2批处理应用程序迁移jdk1.7.0_25jdk1.7.0_40x64和Oracle.

使用Sun OperatingSystemMXBean.getProcessCpuTime()作为性能指标,结果显示性能下降2.5倍(即,我在u25上运行的应用程序要快得多).

  • 据我所知,这不是由于java.util.HashMapjava.util.ArrayList 更改,因为当使用u25的HashMap和ArrayList类引导u40时结果是相同的,并且这些更改对于这种差异来说太小了.
  • 这关系到HashMap中并发也不是回归作为应用程序是单线程和回归固定在U40 ..
  • Hotswap优化似乎也不是问题,因为运行-Xbatch-Xcomp产生相同的结果(假设这些JDK之间的服务器编译是相同的).
  • 有一个表现回归,java.lang.invoke.MethodHandles但似乎无关.除非Spring 3.1.2使用它们 - 我找不到它的证据.
  • javac 编译似乎也没有改变.

一些一般性说明:

  • 每个JDK 7版本> = u40(以及最新的JDK 8 jdk1.8.0)都会出现此问题,而版本<u40似乎很好(包括各种版本的JDK 6).
  • 传统的Java代码(例如,运行1000*1000*1000*some_calc)不具备此性能问题,也就是说,不知我的代码或使用库正在做一些奇怪和意外?
  • 测试是使用相同的数据库实例(MSSQL 2008 R2)完成的,而不是它应该重要.
  • 即使OperatingSystemMXBean不可靠,测试的挂起时间也是不同的.
  • 在这两种情况下,GC似乎都是在相同的时间和相同的持续时间内启动的(我一直在+UseSerialGC用于测试).
  • 分析显示没有异常的新热点,尽管它通常显示应用程序的执行时间大幅增加.
  • 测试这些Sun JDK或OpenJDK版本的x86版本(我已经使用过这些版本)不会改变结果.
  • 所有测试的代码(在JDK 6上运行时除外)都是使用编译的jdk1.7.0_40.
  • 在两台不同的计算机上测试了相同的场景:x64和x86.

任何提示或想法?

编辑添加:应用程序的结构是一个外部循环,运行金融蒙特卡罗模拟:即大量的日期,计算等.因此,它目前有点复杂,我同意,不适合找到问题.我将不得不尝试将其缩小.

java performance java-7

17
推荐指数
1
解决办法
441
查看次数

标签 统计

java ×1

java-7 ×1

performance ×1