我们在64位Linux 2.6服务器上运行32位Sun Java 5 JVM,但显然这会将每个进程的最大内存限制为2GB。所以我们建议我们升级到64位JVM以消除限制。我们目前在服务器上运行多个JVM(Tomcat实例)以保持在2GB的限制之下,但为了简化部署,我们想整合它们。
如果你已经这样做了,请问你能分享一下你的经历吗?你在生产中运行64位JVM吗?你会建议留在Java 5,还是可以同时转移到Java 6 和 64位?我们是否应该期待性能问题,无论是好还是坏?我们应该关注回归测试的特定领域吗?
感谢您的任何提示!
答案 0 :(得分:9)
在Kepler科学运营中心,我们有大约50台机器,每台机器32-64G。 JVM堆通常为7-20G。我们使用的是Java 6.操作系统有Linux 2.6内核。
当我们迁移到64位时,我预计运行64位JVM会出现一些问题,但实际上还没有。内存不足的情况更难调试,因为堆转储要大得多。 Java Service Wrapper需要一些修改才能支持更大的堆大小。
网上有一些网站声称GC在2G之后不能很好地扩展,但我没有看到任何问题。最后,我们正在进行吞吐量密集型交互式密集型计算。我从来没有看过延迟差异;我的猜测是最糟糕的情况,随着堆大小的增加,GC延迟会更长。
答案 1 :(得分:6)
我们使用64位JVM,其堆大约为40 Gb。在我们的应用程序中,大量数据被缓存,导致大量“旧”代。默认的垃圾收集设置不能很好地工作,需要在生产中进行一些痛苦的调整。经验教训:确保在扩展之前有足够的负载测试基础设施。也就是说,一旦我们解决了问题,GC的表现一直很好。
答案 2 :(得分:5)
我可以确认肖恩的经历。我们正在运行纯Java,计算密集型Web服务(自制的Jetty集成,现在有超过1k的servlet线程,并且内存中加载了大约6Gb的数据),并且我们所有的应用程序都可以很好地扩展到64位JVM。我们迁移2年前。我建议使用最新的Sun JVM,因为在最近几个版本中已经对GC开销进行了大量改进。 Tanukisoftware的Wrapper也没有任何问题。
答案 3 :(得分:3)
您编写的任何JNI代码都假定它以32位运行,需要重新测试。对于问题,您可能会遇到从32位到64位移植c代码的问题,请参阅此链接。这不是JNI具体但仍然适用。 http://www.ibm.com/developerworks/library/l-port64.html
答案 4 :(得分:1)
从JDK5 32位(Windows服务器)迁移到JDK6 64位后,我们在“perm gen space”内存块中出现泄漏。使用JDK参数后,它已解决。希望你比我们更幸运。
答案 5 :(得分:0)
如果您使用numactl --show,您可以看到服务器中内存条的大小。 我发现GC使用多个内存条时不能很好地扩展。这是一个硬件而不是软件问题恕我直言,但它可以影响你的GC时间。