我们计划将当前运行在Java5堆栈上的企业应用程序迁移到Java7堆栈。我们遇到了隐式gc调用(主要是主gc)的问题,导致系统在短时间内(从5分钟到30分钟)不稳定。在分析gc统计数据后,我们发现与标记和扫描阶段相比,Compact阶段需要相当长的时间才能完成。我知道压缩是非常复杂和耗时的,但它会影响面向客户的应用程序服务器,在这个阶段几乎没有断开连接。
现在,我的问题是,当我们迁移到Java7时,是否有比Java5更好的垃圾收集过程?
应用服务器提供了不错的系统资源。
- 每个应用服务器包含32个cpu核心
- 包含64 gb ram
- 应用服务器是IBM webpshere服务器
- 操作系统-64位IBM AIX
如前所述,gc的发生是由于隐式系统调用。没有调用gc的显式系统调用。
现在,我的问题是,当我们迁移到Java7时,是否有比Java5更好的垃圾收集过程?
一般来说是的,不过作为@Pushkar,您确实应该迁移到Java8。
关于应用程序的细节,听起来您需要在Java5上调整/重新调整垃圾收集。如果您周期性地经历5到30>>分钟<lt;由于GC的不稳定性,出现了一些相当错误的地方。当前的行为可能是由于您的应用程序或Websphere(例如内存泄漏、缓存过多等),也可能是由于GC调整不力。
简而言之,切换到Java7(或8)可能会"开箱即用"地让事情变得更好,但您可能需要付出更多的努力来解决问题的根本原因。
最后,我建议一些显而易见的事情。
-
以小步骤实施更改。不要同时升级您的应用程序、websphere版本、java版本等。
-
一次升级一台服务器。制定一个回滚计划,以防你的表现令人无法接受。
-
如果可能的话,先测试一下。。。包括性能/负载测试。
默认情况下,java7在服务器类机器上使用parallelGC。如果您使用的是JDK7更新4或更高版本,请切换到G1垃圾收集器,这可能会给您带来更好的性能。但正如@the8472所建议的,最好知道您在java5中使用了什么设置,现在在当前环境中使用了哪些设置。
Java 7在2015年4月左右就宣告了生命的终结。为什么不迁移到1.8?
GC性能通常会随着java主要版本的发布而提高(在某些情况下,还会随着次要GC的发布而改进)。
您应该看看GC调优标志的区别,下面的链接可能会对您有所帮助http://www.oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html
http://stas-blogspot.blogspot.com/2011/07/most-complete-list-of-xx-options-for.html