Java 64位操作系统上的32位或64位应用程序?

Java 64位操作系统上的32位或64位应用程序?,java,64-bit,32-bit,cons,Java,64 Bit,32 Bit,Cons,我们正在开发一个由Java编写的swing应用程序,它只需要大约128MB的内存,在不久的将来,我认为它不会像4GB那样需要更多的内存。在此之前,我们始终提供3个不同的版本,一个用于32位Windows,一个用于32位Linux,另一个用于64位Linux,并带有包含JRE的安装程序。 直到几周前,64位版本才被任何人使用,并且报告了OutOfMemoryException,因为该应用程序比32位版本多消耗40-50%的内存 我的问题是,如果应用程序永远不需要使用超过4GB的内存,我们是否需要为

我们正在开发一个由Java编写的swing应用程序,它只需要大约128MB的内存,在不久的将来,我认为它不会像4GB那样需要更多的内存。在此之前,我们始终提供3个不同的版本,一个用于32位Windows,一个用于32位Linux,另一个用于64位Linux,并带有包含JRE的安装程序。 直到几周前,64位版本才被任何人使用,并且报告了OutOfMemoryException,因为该应用程序比32位版本多消耗40-50%的内存


我的问题是,如果应用程序永远不需要使用超过4GB的内存,我们是否需要为64位Linux提供64位版本?我们进行了一些快速测试,结果表明32位版本也可以在64位Linux上运行。但我不确定我们会有什么缺点,例如性能和/或兼容性问题?

如果您的应用程序没有为64位主机操作系统提供任何改进,并且与您的32位版本兼容,那么我认为没有立即提供它的必要

然而,大多数(如果不是所有的话)新系统都基于x64体系结构,我主张64位软件也应该是默认的。这一需求随着您接近硬件级别而增强。我不能告诉你仅仅为了支持某个32位VPN客户端而运行一个虚拟操作有多糟糕


如果您决定将64位客户端作为首选,则升级64位客户端可能会影响您的下载统计数据

检查这一点

大多数32位JVM限制在1.2-1.5 GB左右

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

我的问题是,如果应用程序永远不需要使用超过4GB的内存,我们是否需要为64位Linux提供64位版本

如果应用程序不需要那么多内存,64位安装程序/JVM不会增加任何价值。相反,这是一个糟糕的选择,因为(正如您所观察到的)它只是使用了更多的内存,并且(可能)因此运行较慢

(实际上,实际限制将小于4GB。由于硬件架构问题,32位地址空间的某些部分将无法使用。)

我建议您撤销64位版本,但让用户能够使用他们单独下载和安装的JVM。(事实上,您可能无论如何都应该这样做。当人们升级以获得最新的JVM安全修复时,JRE的嵌入式副本往往会被忽略……)


更新(2019)-Java 8是Oracle为32位平台提供的Java的最新版本。从Java 11(当前的LTS版本)开始,针对Linux、MacOS、SunOS/SPARC和Windows的Oracle标记发行版仅为64位

我现在的建议是尽快将您的产品从32位迁移出去。您不希望被困在试图支持Java的EOL’d版本的产品上


诚然,32位Java11可以从Azul获得。(我注意到针对Linux的Java 11的32位“Zulu”版本,但不适用于Windows或MacOS.YMMV。)

让我澄清一点:32位版本使用128MB作为最大内存,对于64位版本,可能需要192MB,因此我们不仅需要创建额外的64位安装程序,还需要创建不同的配置,这使得整个事情变得更复杂。如果我们对所有版本都使用192MB,那么它可能会使内存泄漏对我们来说不那么明显,因为32位版本是目前最常用的版本。还有一件事是,许多应用程序可以在该服务器上运行,因此我们希望尽可能降低内存消耗。如果在64位JVM中使用32位引用,则不需要更多内存。