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