`
langzhiwang888
  • 浏览: 177016 次
  • 性别: 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位的时候要意识到它所带来的影响。但是不要害怕去选择。各位程序员,你们在实践中又是如何选择和决定的呢?不妨和我们分享分享吧!
分享到:
评论

相关推荐

    jco3_linux JAR包

    在调用BAPI时,SAP为各编程环境(VB、C++、Java等)提供了RFC...JCo有32位和64为之分,32位的JVM选择32位的JCO, 64位的JVM选择64位的JCO, 在windows环境,选择相应的sapjco3.dll, Unix和Linux环境选择合适的sapjco3.so

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 12 1.4.5 64位虚拟机 / 13 1.5 实战:自己编译JDK / 13 1.5.1 获取JDK源码 / 13 1.5.2 系统需求 / 14 1.5.3 构建编译环境 / 15 1.5.4 准备依赖项 / 17 1.5.5 进行编译 / 18 1.6 本章小结 / 21 第二部分 ...

    AtX:elf将Arm32转换为X86_64

    我试图回答将ARM32 elf二进制文件转换为X86_64 elf二进制文件有多困难。 这是纽约大学Stephen A. Ridley教授的“嵌入式开发的艺术”课程[2020年Spring]的课程项目。 最初的想法是能够对简单的ARM32二进制文件执行此...

    java猜数字源码-JacobMathType:JACOB是一个Java到微软的COM接口的桥梁。使用JACOB允许任何JVM访问COM对象,

    JACOB目前已经成为sourceforge的一个开源项目,官网地址为,现在最新的版本是jacob-1.18,你可以在上找到最新的jacob.jar包和jacob.dll库,使用的时候还需要注意这两个东西的版本需要一致,而且还分32位和64位的,它的...

    JAVA面试题最全集

    如何取小数点前两位,并四舍五入。 4.日期和时间 如何取得年月日,小时分秒 如何取得从1970年到现在的毫秒数 如何获取某个日期是当月的最后一天 如何格式化日期 5.数组和集合 6.文件和目录(I/O)操作 如何...

    java基础题 很全面

    64. List、Map、Set三个接口,存取元素时,各有什么特点? 14 65. UML方面 14 66. 说出一些常用的类,包,接口,请各举5个 14 67. 开发中都用到了那些设计模式?用在什么场合? 15 68. Anonymous Inner Class (匿名内部类) ...

    java面试题

    84.8. 将一个键盘输入的数字转化成中文输出(例如:输入1234567,输出:一百二拾三万四千五百六拾七),请用java语言编一段程序实现! 114 84.9. 题目1:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有...

    最新Java面试宝典pdf版

    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...

    Java面试宝典2010版

    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...

    Java面试笔试资料大全

    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...

    raptor-chess-interface:猛禽国际象棋接口在 http 的分叉

    Windows Vista/7 32 位 JVM(安装程序) Windows Vista/7 64 位 JVM(安装程序) Linux 32 位 Linux 64 位 Linux Deb 包(适用于 i386 和 amd64) 消息 .98u3f4 的包已经上传。 此版本包含大量错误修正。 .98u2 ...

    java面试宝典2012

    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...

    JAVA面试宝典2010

    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...

    Java面试宝典2012版

    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...

    Java面试宝典-经典

    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...

    java面试题大全(2012版)

    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...

    Java面试宝典2012新版

    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...

    JAVA基础课程讲义

    第十二章 GUI编程之AWT 214 为什么需要GUI?GUI是什么? 214 AWT是什么? 214 AWT的优势 214 AWT的缺点 214 为什么还需要学习AWT? 215 AWT各组件的整体关系 215 组件 215 容器 216 布局管理器 218 为什么需要布局管理...

Global site tag (gtag.js) - Google Analytics