Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JRE 32位对64位_Java_X86_X86 64_Jvm Hotspot - Fatal编程技术网

Java JRE 32位对64位

Java JRE 32位对64位,java,x86,x86-64,jvm-hotspot,Java,X86,X86 64,Jvm Hotspot,我已经使用Java有一段时间了,我建立一台新开发机器的典型仪式需要从Oracle的站点下载和安装最新的JDK 今天,这引发了一个不同寻常的问题,使用32位还是64位JRE捆绑包有关系吗? 回想起来,我以前安装过这两个版本,我的普通工具链插件(Eclipse)也安装过。在我的日常编程中,我不记得曾经因为我使用64位JRE(或针对64位JRE)而不得不改变某些东西或以不同的方式思考某些事情 从我对64位和32位的理解来看,这实际上归结为数字是如何存储在封面下的。。。我知道,int是32位,long是

我已经使用Java有一段时间了,我建立一台新开发机器的典型仪式需要从Oracle的站点下载和安装最新的JDK

今天,这引发了一个不同寻常的问题,
使用32位还是64位JRE捆绑包有关系吗?

回想起来,我以前安装过这两个版本,我的普通工具链插件(Eclipse)也安装过。在我的日常编程中,我不记得曾经因为我使用64位JRE(或针对64位JRE)而不得不改变某些东西或以不同的方式思考某些事情

从我对64位和32位的理解来看,这实际上归结为数字是如何存储在封面下的。。。我知道,
int
是32位,
long
是64位。。。与
float
为32位和
double
为64位相同——那么是否只是Java已经将这一微妙之处抽象出来,并且可能一直都是“64位兼容”的呢


我确信除了不能在32位系统上安装64位JRE之外,我还缺少一些东西

正如您所注意到的,Java中的基本数字类型是定义良好的

但是,如果您的Java应用程序使用的是本机代码库,则32位JVM和64位JVM之间的选择可能很重要,本机代码库可能是为在32位应用程序、64位应用程序或两者中使用而构建的


如果您有只支持32位应用程序的本机库,则需要使用32位JVM,或者构建64位版本的库。

64位与32位实际上归结为对象引用的大小,而不是数字的大小

在32位模式下,引用是四个字节,允许JVM唯一地寻址2^32字节的内存。这就是32位JVM被限制为4GB最大堆大小的原因(实际上,由于其他JVM和操作系统的开销,限制更小,并且根据操作系统的不同而不同)

在64位模式下,引用是(令人惊讶的)8个字节,允许JVM唯一地寻址2^64字节的内存,这对任何人来说都足够了。64位模式下的JVM堆大小(用
-Xmx
指定)可能非常大

但64位模式带来了成本:引用的大小是原来的两倍,增加了内存消耗。这就是为什么甲骨文公司推出了。启用压缩oops(我认为这是现在的默认设置)后,对象引用将缩减为4个字节,但需要注意的是,堆限制为40亿个对象(和32GB Xmx)。压缩OOP不是免费的:要实现内存消耗的大幅减少,需要很小的计算成本


作为个人偏好,我总是在家里运行64位JVM。CPU支持x64,操作系统也支持,因此我喜欢JVM也以64位模式运行。

根据上下文,对于本地开发,我将始终使用64位JDK。主要是因为我可能需要整个内存空间用于构建和IDE

也就是说,要集成到生产环境中,如果可能的话,我建议使用32位。为什么?

对于一些获得生产使用许可的Java EE服务器,这将取决于一些因素,如哪台机器、多少个内核等。具体来说,对于WebSphere Liberty Profile,您还被限制为2GB

64位JRE将占用稍多的内存,如果您试图将其限制在2GB或更好的2x 1GB集群上,您将有更多的flex空间可供使用,而无需支付一分钱

问题1:64位上需要30-50%的堆。为什么会这样?主要是 因为64位体系结构中的内存布局。首先—— 64位JVM上的对象头是12个字节。第二,对象引用 可以是4字节或8字节,具体取决于JVM标志和大小 一堆的。与8相比,这无疑增加了一些开销 32位的头上有个字节,引用上有4个字节。你也可以挖 有关计算的更多信息,请访问我们之前的一篇文章 对象的内存消耗

问题2:垃圾收集暂停时间过长。建立更多的堆 意味着GC在从中清理时需要做更多的工作 未使用的对象。在现实生活中,这意味着你必须 在构建大于12-16GB的堆时要格外小心。没有罚款 调整和测量您可以很容易地引入完整的GC暂停 几分钟。在延迟不重要的应用程序中 只能优化吞吐量这可能没问题,但在大多数情况下 这可能会成为一个障碍


为了限制您对Java EE环境的影响,请将部分内容转移到其他微服务,如ElasticSearch for search、Hazelcast for caching、,您的数据库用于数据存储,并使java EE服务器托管您的应用程序核心本身而不是运行它内部的服务。

< P>我认为有两个主要的差异需要考虑。这里提到了一个,但没有提到另一个

一方面,正如其他人提到的,内存和数据类型。32位和64位JVM使用不同的本机数据类型大小和内存地址空间

  • 64位JVM可以分配(使用)比32位JVM更多的内存
  • 64位使用容量更大但占用更多空间的本机数据类型。因此,同一个对象也可能占用更多的空间
  • 对于垃圾收集器(GC)冻结机器的JVM,64位版本可能会慢一些,因为GC必须检查更大的堆/对象,这需要更多的时间
  • 有一种解释这些差异的方法
另一方面,支持的本机库。使用JNI访问本机库的Java程序需要不同的版本,具体取决于JVM的类型

  • 32位JVM使用32位本机库,64位JVM使用64位库
  • 这意味着,如果你的程序使用libra