Sam*_*erg 4 java performance jrockit
我对升级到Java 7非常感兴趣(出于我自己编码的原因).但是,我们的用户对延迟非常敏感(一切都需要亚毫秒级).我在3个不同的JVM之间进行了简单的性能比较测试,发现Java 7要慢得多.测试通过我们的应用推送了一些简单的消息.此测试是一种低负载,负载量测试,每隔几秒就会推送一条消息.结果是(以微秒为单位):
- Hotspot 6 (build 24): msgs= 23 avg= 902
- JRockit 6 (R28 b 29): msgs= 23 avg= 481
- Hotspot 7 (build 04): msgs= 34 avg=1130
Run Code Online (Sandbox Code Playgroud)
Oracle的策略是从Java 7开始合并JRockit和Hotspot(因此JRockit 6是最后一个可用的).有没有人有任何想法为什么表现更糟糕?(需要注意的一点是,代码是在Java 1.6下编译的.不确定是否可以解释它......)
更新:我投票结束了我自己的问题,因为我可以从评论中看到,我无法真正传达足够的信息,使其成为一个建设性的问题.感谢所有评论的人.
更新:更多反馈后,我想我会提供更多信息.测试总是在重新开始之后.每个测试的所有因素都相同.唯一改变的是JVM.多次重复测试可得到一致的结果.在任何测试迭代中都没有发生GC.
下面是其中一个测试运行的图表值.对于JRockit和Hotspot 7,第一个延迟值被抛弃了.JRockit具有巨大的第一价值,但随后很快就会优化并稳定下来.Hotspot 7需要更长时间才能进行优化,并且永远不会降至JRockit的平均值.每个数据点表示从TCP/IP套接字读取消息,运行业务逻辑以及在另一个套接字上写入消息的微秒.每条消息都是相同的,并且没有为任何消息输入新的代码路径.
Mar*_*cus 10
JRockit是它自己的(纯C)代码库,不同于OpenJDK.它包含不同的垃圾收集器,以及完全不同的JIT编译器.BEA拥有的一个大型货币供应商是低延迟GC,即使在非商业版本中也是如此.JRockit花费了大量时间作为一个洁净室vm实现.正如在评论中所说的那样,并不是在HotSpot代码库中重新实现内容的合并问题.这是远离一个快速的过程和一些事情在他们的JRockit的形式在所有那里,至少在他们的.如果没有一些锉边缘,拼图块就不容易贴合,可以这么说.JDK7 Hotspot,擅长其他东西,或类似系统的不同版本,但这可能会弥补你失去的一些性能.其他应用程序可能比JRockit 6运行得更快.
如果您有兴趣了解有关JRockit(或任何JVM)内部的更多信息,那么强烈推荐阅读"Oracle JRockit权威指南"一书.完全披露,我可能会在每个版税的版税中获得约2美元,并将用它来购买浓缩咖啡.:)
这个问题的主要内容是,所有其他条件相同(包括JVM args)为什么使用Hotspot 7 JVM时,相同的JAR Java代码运行速度比使用JRockit 6和Hotspot 6要慢得多.
这引起了一些关注时间是否正确完成的反应(显然是由于人们怀疑JVM之间确实会有这样不同的结果).基于众多测试,我认为测量结果是正确的.
我认为可能的答案是:
事实上,新的Java 7 JVM行为与我们的应用程序非常不同,所有其他条件都相同.唯一的解决方案是针对Java 7 VM分析代码,以发现代码中慢点的位置.(也许在那时,很清楚Java 6 JVM和Java 7 JVM之间的实际差异是什么).
我感谢大家的评论,并对我无法提供足够详细的清晰分析/解决方案表示歉意.
归档时间: |
|
查看次数: |
6374 次 |
最近记录: |