anj*_*anb 5 java performance 64-bit jvm stability
我以不同的方式问了同样的问题,问题已经结束:https ://stackoverflow.com/questions/7231460/java-64-bit-or-32-bit
这是我第二次尝试获得客观答案(s ).
我们正在考虑将我们的产品转移到64位Java,以满足那些在Solaris(SPARC)和Linux(RHEL 5.x)上推动32位服务器JVM边界的客户.我们的导演问道,"几年前,64位并不完全存在.现在怎么样?"
对于那些没有推动4 GB边界的客户,使用64位JVM会对性能产生不利影响吗?如果是,多少钱?我们创造了很多对象.(我们不希望同时支持32位和64位JVM.这是一个或两种情况,最好).
对于那些推动4 GB边界的人,我们可以期望JVM与32位边界一样稳定吗?
更新:对于那些评论者和那些关闭我之前的问题的人,我相信我现在理解你的焦虑.与此同时,我相信你们中的一些人做了一些(不真实的)假设,我是懒惰的,或者是一个毫无头绪的诉讼.我会在调查后发布我的调查结果.感谢所有给我真正指针的人.
由于您可以自己进行测试,我假设您对使用32/64位JVM的体验抱有"现实生活"的答案.
我是一个为银行创建财务申请的团队的一员.我们在Windows上使用32位JVM进行开发,几乎所有服务器应用程序都运行在运行64位JVM的RHEL上.性能对我们来说从来都不是问题,因为我们使用了不错的机器(我们的常规服务器机器使用具有至少32 GiB RAM的32核AMD盒子).
正如预期的那样,由于指针大小的不同,堆大小会增加,但由于现在限制从4GiB提高,所以它再次不会打扰我们.我们的应用程序也创建了很多对象.使用VisualVM或命令行工具调试我们的应用程序没有问题.关于GC设置,我们使用默认设置并尝试仅在我们测量它实际上是GC创建问题时进行更改.分配一个堆大小比你的应用程序使用的大得多(8GiB)对我们来说很常见,你会看到每天一次大的GC扫描,这是相当不错的.
我听说JDK 7有一个名为G1垃圾收集器的新GC算法,它更适合服务器应用程序,因此你应该完全尝试一下.
所有这一切,你最好的选择是尽可能多地测量(分别在32位和64位机器上使用32 v/s 64位)然后决定.仅供参考,我们的组织完全推进了64位JVM,因为目前大多数库存服务器硬件都是64位,4GiB对于现代服务器应用程序(至少在我们的域中)是非常严格的限制.
我们正在考虑将我们的产品迁移到 64 位 java,以应对那些正在突破 Solaris(SPARC) 和 Linux(RHEL 5.x) 上 32 位服务器 JVM 界限的客户。我们的主管问:“几年前,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 的,据我所知,其工作原理完全相同。YourKit 使用本机库,可能需要确保您使用正确的版本(它通常会为您设置此版本,但如果您弄乱了环境,您可能需要知道代理有两个版本)
如果您担心性能,请不要创建这么多对象。您可能会惊讶地发现,在现实世界的应用程序中,自由创建对象的速度要慢得多。它可以使应用程序速度减慢 2 倍到 10 倍或更多。当我优化代码时,我做的第一件事就是减少对象的丢弃,我期望性能至少提高三倍。
相比之下,使用 64 位与 32 位可能存在 5%-10% 的差异。它可以更快或更慢,并且两者都有可能。就内存膨胀而言,使用最新的 JVM,这不太可能被注意到。这是因为当您使用的内存小于 32 GB 时,64 位 JVM 默认使用 32 位引用。标头开销仍然略高,但在 64 位中,-XX:+UseCompressedOops启用该选项时对象不会大很多(最新版本的默认设置)。
使用 32 位与 64 位 JVM 测试常见对象的大小Java:获取对象的大小
一个极端的例子是,创建大量对象和反射与不创建任何对象并使用动态生成的代码进行相同的操作。性能提升 1000 倍。避免 Java 序列化以提高性能
使用无堆内存可以大大减少 GC 时间。包含数百万元素的集合库
使用更少的堆内存可以让您的应用程序使用更多的内存,而不是将数据传递给另一个应用程序服务器应用程序是否应该将自身限制为 4 GB?
| 归档时间: |
|
| 查看次数: |
985 次 |
| 最近记录: |