我们正在考虑将我们的产品迁移到64位Java,以满足那些在Solaris(SPARC)和Linux(RHEL 5.x)上推动32位服务器JVM极限的客户需求。我们的主管问道:“几年前,64位还不够成熟,现在怎么样了?”Sun公司比Windows早就开始支持64位。1995年发布的Solaris 2.5(与Windows 95同年)在64位方面并不像它本应该有的那么可靠。许多仍在使用SunOS(32位)的人认为这没有意义,而且很少有机器需要更多的内存。1997年发布的Solaris 2.6看到了第一个重要的64位平台迁移。我直到1999年才开始认真使用Java(在Solaris上),那时64位已经在我的脑海中确立了。
1)对于那些没有超过4GB边界的客户,使用64位JVM是否会对性能产生负面影响?如果是,程度如何?
64位JVM的寄存器大小是32位的两倍,数量也是两倍。如果您经常使用long类型,您可以看到显著的改进,然而对于典型应用程序来说,差别在5-10%之间。
我们创建了很多对象。
在我看来,如果这对您来说不是一个问题,那么性能就不是一个大问题。使用任何分析工具,都有两个报告:CPU 和内存使用情况。通常,检查内存配置文件会更加影响性能。(见下文)
(我们最好不要同时支持32位和64位的JVM。这是一个二选一的情况,最好如此)
不能说有太大的区别。您认为支持每个的开销是多少?代码完全相同,从您的角度来看,它可能会稍微增加测试。这与支持两个Java 6版本没有太大区别。
对于那些推动4GB边界的人,我们可以期望JVM与32位一样稳定吗?
自1999年以来,我使用64位版本,我无法记得有什么情况下使用32位会使事情变得更好(只会因为内存有限而变得更糟)。
性能是否成为问题?如果是,减少丢弃对象。
有哪些GC调优技术是新的?
您可以将最大内存大小设置得更高。这就是全部了。只要保持在32 GB以下,内存使用量不会明显增加,因为它使用32位引用。
我通常会将新应用程序的Eden大小设置为8 GB,如果不需要,就会减少它。这可以大大减少GC时间。(甚至可以降低到每天一次;) 这在32位JVM中是不可能的选择。
关于分析64位JVM应用程序,VisualVM是纯Java,并且据我所知,完全相同。YourKit使用本地库,可能需要确保您正在使用正确的版本(它通常会为您设置这个,但如果您更改了环境,则可能需要知道有两个代理的版本)。
如果您担心性能问题,请不要创建太多对象。您可能会惊讶地发现,在实际应用中自由创建对象会使应用程序变得更慢,可以使应用程序变慢2倍到10倍甚至更多。当我优化代码时,我首先要做的是减少对象的丢弃,并期望至少有三倍的性能提升。
相比之下,使用64位与32位可能会有5%-10%的差异。它可能会更快或更慢,两者同样可能。在内存膨胀方面,请使用最新的JVM,这不太可能被注意到。这是因为64位JVM在使用少于32GB的内存时,默认情况下使用32位引用。头部开销仍然略高,但在启用了
-XX:+UseCompressedOops
(最新版本的默认设置)时,对象并没有变得更大。
Java:关于64位编程的一切
使用32位和64位JVM测试常见对象的大小 Java:获取对象的大小
一个极端的例子,做同样的事情创建大量对象和反射 vs 不创建任何对象并使用动态生成的代码。1000倍的性能提升。避免Java序列化以提高性能
使用堆内存可以大幅减少GC时间。面向百万元素的集合库
使用更少的堆内存可以让您的应用程序使用更多的内存,而不是将数据传递给另一个应用程序
服务器应用程序应该限制自己只使用4GB吗?。