`
langzhiwang888
  • 浏览: 183520 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

32位和64位的JVM 我该选择哪个呢?

 
阅读更多
在开发企业软件时,我曾经常遇到这个问题。每隔一段时间我就得去重新配置一下环境。通常问题都与“我到底应该使用32位JVM还是64位”有关。诚实讲,我一开始通过投硬币来决定,而不是给出一个具体的理由。但现在,我已经有了更多的思考和经验,下面就来分享给大家。首先,是否是越大越好?64>32,所以答案就是选择64位吗?停,不要着急。在相同的数据结构下,64位JVM将会消耗更多的内存,甚至更多。我们的测量结果表明,根据不同的 JVM版本、操作系统以及硬件架构,64位要比32位多消耗30%-50%的堆空间。堆越大,GC的时间就会被延长,从而影响应用程序延迟——在4.5GB的堆上运行一个完整的GC所花费的时间肯定要比3GB的长。所以仅仅根据大小来判断是明显错误的。但是,你该何时使用64位呢?大多数情况下是根据大型堆的大小(heap sizes)来决定的。在不同的架构上,32位的JVM可能会面临最大和最小堆限制,下面列出了不同平台上的限制数据:现在你已经看到有多糟糕了吧?我打赌你肯定见过在16G以上的RAM上运行32位的机器并且运行的很好。可是JVM是怎么了?在16G RAM的Windows上,JVM只能分配不到10%的内存。主要原因——地址空间。在一个32位系统上,理论上每个进程可以分配4GB。而实际上并未达到,Windows的进程处理空间被砍掉了一半,有一半是预留给内核(用户进程是不能使用的) ,另外一半则留给用户。与RAM无关,32位处理器留给RAM的容量只有2GB。更糟糕的是,这个地址空间必须是连续的,所以在实际应用中,Windows系统通常只剩下1.5—1.8GB的堆空间。这里有一个技巧,可以在32位的Windows系统上减少内核但可以增加用户空间。你可以在boot.ini里使用3GB参数,然而要想在实际中有效,JVM必须使用LARGEADDRESSAWARE 开关(switch)去编译/链接。 不幸并非如此,至少对于Hotspot JVM来说。直到最新的JDK 1.7版本,Hotspot JVM都没有使用这项进行编译。但如果你在jRockit版本上运行(2006以后的版本)就是很幸运的,你可以享受到2.8-2.9GB大小的堆空间。所以,我们可以下这样的结论吗:如果应用程序需要大于2-3GB的内存时,你应该一直在64位的JVM上运行。也许是这样,但你必须要意识到一些问题,增加堆消耗和延长GC中断。下面让我们来分析一下具体原因。问题1:64位将会多需要30%-50%的堆内存。为什么会这样?主要是因为64位架构的内存布局。首先,在64位JVM中,对象头(object headers)是12字节。其次,根据实际的JVM参数(JVM flags)和堆大小,对象引用可能是4字节或者是8字节。与32位相比,这明显增加了一些额外的开销。你也可以参考这篇文章,进去看看是如何计算对象内存消耗的。问题2:GC中断时间更长。堆构建的越多,意味着GC需要清理更多未使用的对象。这就意味着在实际运用中,当构建超过12-16GB的堆空间时,你需要更加小心。没有调优和测量,你很容易引起一个耗时数分钟的完全GC中断。应用程序在哪里延迟并不是至关重要的,你可以通过优化吞吐量来解决,但是在大多数情况下,它会引起不必要的中断。那么,当需要引入更大的堆,但是又不希望引入64位架构带来的这些影响时,我该怎么做呢?在这篇文章中提供了几个技巧——堆分区、GC调优、在不同的JVM上构建或者离堆分配内存。重申一下,在选择64位的时候要意识到它所带来的影响。但是不要害怕去选择。各位程序员,你们在实践中又是如何选择和决定的呢?不妨和我们分享分享吧!
分享到:
评论

相关推荐

    64位对比32位jvm性能

    通过将该机器配置为32位和64位模式运行,可以实现对两种虚拟机性能的直接比较。 #### 主要发现 1. **对象内存占用差异:** - 在64位模式下,平均而言,对象在堆中的空间比32位模式下大39.3%。 - 这一差异主要是...

    SWT32位和64位库

    SWT,全称为Standard Widget Toolkit,是Java编程中用于创建图形用户界面...同时,随着现代计算机硬件的普及,64位系统和64位JVM已成为主流,但仍然有一部分用户可能还在使用32位系统,因此对两者的支持都不可忽视。

    JDK1.6 32位和64位官方版

    3. 应用兼容性:32位JDK可以运行32位和64位的Java应用程序,但不能运行纯64位的程序。相反,64位JDK只能运行64位的Java应用程序。因此,如果需要运行的软件有特定的位数要求,需要选择相应位数的JDK。 在选择JDK...

    swt64位和32位jar包4.3版本可用

    正常情况下,这些文件名应该是类似"swt-4.3-win32-win32-x86.jar"和"swt-4.3-win32-win32-x86_64.jar"的形式,分别代表32位和64位Windows平台的SWT库。为了使用这些库,开发者需要解压这个压缩包,然后根据他们的...

    JDK1.5的32位和64位安装包

    选择哪个版本取决于你的系统架构,确保安装对应版本以确保最佳兼容性和性能。 总结来说,JDK1.5是Java发展历程中的一个重要节点,它的泛型、自动装箱/拆箱、枚举、变长参数和增强for循环等特性极大地提升了开发效率...

    jre1.6安装版(含32位和64位)

    标题中的“jre1.6安装版(含32位和64位)”指的是这个压缩包包含了适用于两种不同体系结构的Java运行时环境:32位和64位。对于不同的操作系统和硬件平台,选择正确的JRE版本至关重要。 32位JRE主要设计用于32位操作...

    JVM性能调优总结.docx

    JVM性能调优总结 JVM性能调优是Java开发中非常重要的一方面,直接影响到系统...JVM性能调优需要根据实际情况进行调整和选择合适的参数设置。同时,需要注意到操作系统、JDK版本、应用程序等因素对JVM性能调优的影响。

    32位操作系统的jdk1.8版本

    Java Development Kit (JDK) 1.8 是Java编程语言的一个重要版本,尤其对于32位操作系统用户来说,它是开发和运行Java应用程序的基础。在这个版本中,Java引入了许多新特性和改进,使得开发者能够更高效地编写代码并...

    精简JRE(windows32位和64位,linux 32位和64位)

    本资源提供的是精简版的JRE,适用于Windows 32位和64位操作系统以及Linux 32位和64位系统。 精简JRE的主要目的是减少安装包的大小,提高下载和部署的效率,同时降低运行时的内存占用。在JRE中,rt.jar是最核心的库...

    JDK1.8(32位和64位均可正常使用).rar

    **JDK 1.8的32位和64位选择** 32位和64位的JDK主要区别在于内存管理和处理能力。32位JDK在一台计算机上最多只能访问约4GB的RAM,而64位JDK理论上没有这种限制,可以处理更大的数据量和更复杂的程序。然而,32位版本...

    64位与32位 rxtxserial.dll/rxtxParallel.dll

    64位系统在性能、内存管理和处理大量数据方面通常优于32位系统,但同时也需要64位的应用程序和驱动程序才能充分利用其优势。 接着,我们讨论rxtxParallel.dll和rxtxSerial.dll。这两个文件是RXTX库的一部分,RXTX是...

    jdk1.6(32位&64;位)

    标题“jdk1.6(32位&64位)”指的是Java Development Kit的1.6版本,它提供了适用于32位和64位Windows操作系统的安装包。Java JDK是开发和运行Java应用程序的基础工具集合,包含了编译器、调试器、文档生成器以及各种...

    JDK 8 32位和64位安装包

    在选择JDK 8的安装时,用户通常会面临32位和64位版本的选择。这两个版本主要的区别在于它们支持的内存大小以及适用的操作系统类型。 1. **32位与64位的区别** - **内存限制**:32位操作系统最大支持约4GB的RAM,而...

    JVM调优总结 -Xms -Xmx -Xmn -Xss

    在 32 位系统下,一般限制在 1.5G~2G,而 64 位操作系统对内存无限制。 -Xmx 设置 JVM 的最大可用内存,-Xms 设置 JVM 的初始内存大小。二者的值可以相同,以避免每次垃圾回收完成后 JVM 重新分配内存。 -Xmn ...

    JDK6 32位和64位安装包

    在这个压缩包中,包含了JDK6的32位和64位版本,这使得它可以适应不同的操作系统环境。 首先,让我们来了解一下32位和64位的区别。在计算机架构中,32位系统处理的数据宽度为32位,而64位系统则可以处理64位数据。这...

    JVM知识图谱.pdf

    #### 十四、解释器与编译器并存架构的优势 - **启动速度快**:初始使用解释器执行,减少启动延迟。 - **后期性能优化**:编译器将热点代码编译为机器码,提高执行效率。 #### 十五、选择编译器的标准 - **应用...

    tomcat6 64位 tomcat6 32位

    总结来说,选择32位还是64位的Tomcat,主要取决于你的应用需求、硬件资源和兼容性考虑。对于轻量级应用或有限的硬件资源,32位Tomcat可能是最佳选择;而对于大型、资源密集型的应用,64位Tomcat则能提供更好的性能和...

    浅谈IBM AIX环境下的Java性能调优

    AIX支持多个Java版本,包括1.1.8到1.4的32位和64位版本。为了获得最佳性能,应选择最新版本的AIX和Java,并确保安装所有必要的操作系统和Java补丁。在需要超过2GB堆内存的情况下,64位Java是必需的。IBM的官方网站...

    HiJson 2.1.2的32位和64位.rar

    总之,HiJson 2.1.2的32位和64位版本为开发者提供了灵活的选择,无论是在内存受限的32位系统还是在需要高性能的64位环境中,都能确保JSON处理的效率和稳定性。在开发过程中,根据具体需求选择合适的版本,可以提升...

Global site tag (gtag.js) - Google Analytics