64位操作系统上运行32位还是64位应用程序?

5
我们正在开发一款使用Java编写的Swing应用程序,只需要大约128MB的内存,并且在短期内不会像4GB那样需要更多的内存。之前,我们提供了三个不同的版本,一个是32位Windows版本,一个是32位Linux版本,另一个是64位Linux版本,安装程序包含JRE。
直到几周前,没有人使用64位版本,但因为该应用程序消耗的内存比32位版本多40-50%,所以报告了OutOfMemoryException。
我的问题是,如果该应用程序永远不需要使用超过4GB的内存,那么我们是否需要为64位Linux提供64位版本?我们进行了一些快速测试,发现32位版本也可以在64位Linux上运行。但我不确定可能存在的缺点,例如性能和/或兼容性问题。

让我稍微澄清一下:32位版本使用128MB作为最大内存,而64位版本可能需要192MB,因此我们不仅需要创建额外的64位安装程序,还必须创建不同的配置,这使得整个过程更加复杂。如果我们为所有版本使用192MB,则可能会使内存泄漏对我们不太可见,因为32位版本现在是最常用的。还有一件事是许多应用程序可以在该服务器上运行,因此我们希望尽可能降低内存消耗。 - Wayne Xu
如果在64位JVM中使用32位引用,不会需要更多的内存。 - Peter Lawrey
4个回答

3
如果你的应用程序在64位主机操作系统上提供不了任何改进,并且与你的32位版本兼容,那么我认为暂时不需要提供它。
然而,大多数,如果不是所有新系统都基于x64架构,我倡导64位软件也应该成为自然默认选择。这种需求越来越强烈,尤其是接近硬件层级的情况下。我无法告诉你运行虚拟操作系统以支持某些32位VPN客户端有多么麻烦。
如果你决定将64位客户端作为首选选择,则推广64位客户端可能会影响你的下载统计数据。

2

请查看64位Java,该问题与小型独立应用程序有关的技术。


2

大多数32位JVM的内存限制在1.2-1.5 GB左右。

如果您发现您的应用程序使用64位JVM时需要更多的内存,请尝试使用-XX:+UseCompressedOops。这告诉64位JVM使用32位引用,但仍然可以访问32 GB的内存。


2
我的问题是,如果应用程序永远不需要使用超过4GB的内存,我们是否需要为64位Linux提供64位版本?
如果应用程序不需要那么多内存,64位安装程序/JVM就没有任何价值。相反,它是一个糟糕的选择,因为(正如您所观察到的)它只是使用更多的内存,从而(可能)运行得更慢。
(实际上,实际限制将小于4GB。由于硬件架构问题,32位地址空间的某些部分将无法使用。)
我建议您撤回64位版本,但为用户提供使用他们已经单独下载和安装的JVM的能力。(实际上,您应该无论如何都要这样做。嵌入式JRE副本往往会被忽略,当人们升级以获取最新的JVM安全修复程序时...)
更新(2019)- Java 8 是 Oracle 提供给32位平台的最后一个版本。从Java 11开始(当前的LTS版本),Oracle标记的Linux、MacOS、SunOS / SPARC和Windows发行版都仅支持64位。
我的建议是尽快将您的产品迁移到64位,您不希望在已经停止支持的Java版本上继续支持产品。
当然,根据this Q&A,Azul提供了32位Java 11。(我注意到Linux有32位“Zulu”版本的Java 11,但Windows或MacOS没有。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接