应该使用32位还是64位JVM

[Java JVM] Hotspot GC研究- 64位引用指针压缩技术 为什么需要指针压缩在上一篇文章 [Java JVM] Hotspot GC研究- 开篇&对象内存布局 中介绍对象内存布局时, 曾提到过, 由于在64位CPU下, 指针的宽度是64位的, 而实际的heap区域远远用不到这么大的内存, 使用64bit来存对象引用会造成浪费, 所以应该做点事情来节省资源. 如何做基于以下事实: CPU 使用的虚拟地址是64位的, 访问内存时, 必须使用64位的指针访问内 阅读详情
应用使用32位的JVM,还是应该使用64位的JVM,我自己以前还真没想过,大家都想过了吗?本文是 Plumbr 中的一篇 博文 ,为大家提了个醒。(2012.11.27最后更新)

    在我的企业级软件开发职业生涯中,我多次面对这个问题。每隔一段时间我不得不建议配置一个新的特定环境。而往往该问题部分与"我应该使用32位还是64位JVM?"这一问题有关。老实说,一开始我是靠掷硬币来解决的,而不是给出一个合理的答案。(抱歉,兄弟们!)但现在我对这个问题有了更多的领悟,并想与你们分享。
    第一步--越多越好,对吗?即如此,因为64>32,所以答案很简单:如果可能的话,应该总是选择64位?好吧,请耐心点儿。64位架构的坏处是,相同的数据结构会消耗更多的内存,甚至是多很多。我们的测评显示,根据不同的JVM版本和操作系统版本,以及相应的硬件架构,最终会用掉比32位架构多30-50%的堆内存。更大的堆也会造成更长的GC暂停,这会对应用程序造成潜在的影响--在4.5G的堆上执行完全GC肯定会比在3G的堆上执行花费更长的时间。所以,仅仅是因为64比32大就去赶64位JVM的时髦,肯定是错误的。
    但,什么时候才是使用64位JVM的好时机呢?多数情况下,要看堆的大小。在不同的平台下,你很快就得面对32位JVM堆内存的上限问题。下表列出了在不同平台下的这种限制:
Linux         2GB       特定内核,如hugemem,可以达到3G
Windows    1.5GB    使用"/3G"的启动参数并使用/LARGEADDRESSAWARE参数去编译JRE,则可提高到3G
Mac OS X   3.8GB    警告--未能找到老的Mac,所以没有对其进行测试

    那么,这有什么坏处?我打赌,你肯定见过在16G的RAM上运行32位的机器。问题就在于,在只有16G RAM的Windows系统中,JVM只能分配到少于10%的内存。
    主因--地址空间。在32位系统中,理论上可以为每个进程分配4G内存。而Windows系统对地址空间的处理使这一理论值无法达到。Windows将进程的地址空间砍掉了一半。一半留给了内核(用户进程无法使用它),另一半则留给了用户。无论系统中有多大的RAM,32位进程只能使用到2G的RAM。更糟的是--地址空间必须是连续的,所以在实践中,Windows系统最多只为你剩下了1.5-1.8G的堆内存。
    有一个在32位Windows系统中减少内核空间并增加用户空间的窍门,即,可以在boot.ini系统使用/3GB参数。然而,为了能确保它有效,必须使用/LARGEADDRESSAWARE开关去编译或链接JVM。
    不幸地是,至少对于HotSpot JVM无法做到这一点。直到最新的JDK 1.7版本,HotSpot JVM仍未使用该选项进行编译。但又幸运地是,如果你运行2006年之后的JRockit版本,就能享用到2.8-2.9G的堆大小。
    那么,我们是否可以得出结论,如果你的应用要求大于2-3G的内存,你就总是应该运行64位的JVM?也许。但你也必须要清楚应用的场景。我们已经介绍了使用64位JVM的坏处--增加的堆消耗,以及更长的GC中断。让我们分析一下原因。
     问题1:64位JVM需要多出30-50%的内存。 为什么会如此呢?主要是因为内存是以64位架构进行部局。首先,在64位JVM中,对象头有12字节。其次,对象引用会占用4字节或8字节,实际值取决于JVM的参数与堆的大小。相较于32位JVM的8字节对象头和4字节对象引用,毫无疑问会增加一些开销。在我们 之前发布的博客 中你会找到更多关于如何计算对象内存的相关信息。
     问题2:更长的垃圾收集中断。 构建更大的堆意味着GC要做更多的工作去清理无用的对象。这意味着,在实际应用中构建大于12-16G的堆时,你必须要特别小心。没有很好的性能调优与测评,你很容易就会引起一个耗时数分钟的完全GC。在应用程序的非关键潜在危险场景中,通过对吞吐量的优化或许能解决这一问题,但在多数情况下,它会造成程序中断。
    当我需要更大的内存且又不希望引入由64位架构所造成的开销,那该怎么办呢?在我们 以前的一篇博文 中已经涉及了这个问题--通过对堆的分区,GC调优,构建不同的JVM,或对堆分配不同的内存,就可以避免这一问题。
    最后,让我们重申,你应该总是要意识到选择64位JVM的后果,但也不要惧怕这一选择。
StarRocks慢查询排查实战:从Query Plan到Profile的保姆级调优指南 本文提供StarRocks慢查询排查的实战指南,从Query Plan解析到Profile诊断,详细讲解如何识别执行计划中的危险信号和优化关键指标。通过物化视图优化、分布式执行调整和资源管控方案,帮助DBA快速定位并解决查询性能问题,提升数据库效率。 阅读详情

相关推荐

别再找在线API了!用C#调用微信电脑版自带的OCR,本地识别又快又准

本文详细介绍了如何利用C#调用微信电脑版内置的OCR引擎实现本地文字识别,解决传统云端API的隐私和网络依赖问题。微信OCR具备高精度中文识别、完全离线运行和零成本接入三大优势,特别适合企业文档电子化处理。通过实战代码演示了核心交互逻辑、批量处理流水线和表格数据提取等高级应用场景。

weixin_29295541的博客 589

64位JVM的Java对象头详解

中添加一个字段,并提供一个方法访问,程序运行就会报错,因此,这样创建的对象只能调用方法,不能访问字段。位,而且很多都是从一些书上摘抄下来的,难免会存在错误的地方,所以最好的学习方法就是自己去验证,看。Little-Endian:低位字节存放在内存的低地址端,高位字节存放在内存的高地址端。Big-Endian:高位字节存放在内存的低地址端,低位字节存放在内存的高地址端。因此,开启指针压缩,理论上来讲,大约能节省百分之五十的内存。开启指针压缩情况下,而且,根据从各种来源的资料中,我们所知道的是,对象头的前。

吴就业 8156

CST 仿真_NFC仿真

在CST中实现NFC天线单体的仿真

qq_43706810的博客 3961

64位jvm和32位jvm性能

原文引自于: http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#64bit_description 一般来说,64位jvm相比32位jvm能够处理更大的内存,但伴随而来的一个小的性能损失。 这是因为系统中的每个本地指针在64位jvm上都占用8个字节而不是4个。加载这些额外的数 据会影响内存使用量,这会导致执行速度稍...

wisgood的专栏 7563

深入解析WIFI与蓝牙模块电路设计:从原理到实战

本文深入解析了WIFI与蓝牙模块的电路设计,从核心原理到实战应用。文章以AP6256模块为例,详细拆解了电源树、时钟电路、接口设计及天线射频路径等关键环节,并提供了PCB布局布线的实用准则与调试方法,旨在帮助硬件工程师设计出稳定可靠的无线产品,规避常见陷阱。

weixin_29186249的博客 150

跨平台烧录实战:RKDevTool在Windows/Linux/MacOS下的统一与差异

本文详细解析了RKDevTool在Windows、Linux和macOS三大操作系统下的固件烧录实践,重点介绍了RK3576开发板的环境配置、工具链选择、烧录模式切换及常见问题解决方案,帮助开发者构建稳定可靠的跨平台烧录工作流。

cnn8visionary的博客 206

我应该使用32位还是64位JVM?

这是我在企业软件开发生涯中多次遇到的问题。 我不得不每隔一段时间就提供有关配置特定新环境的建议。 而且,很多时候,手头的问题与“我应该使用32位或64位JVM”有关。 老实说,一开始我只是掷硬币。 而不是给出合理的答案。 (对不起,兄弟!)但是到目前为止,我已经对此进行了更多的了解,并希望与您分享。 第一站–越多越好。 对? 所以–当64> 32时,这很容易 答:如果可能,请始终...

最佳 Java 编程 331

CANoe UDS $27服务DLL生成实战:从工程配置到算法修改全流程

本文详细介绍了在Vector CANoe中为UDS(统一诊断服务)的$27安全访问服务生成定制化DLL(动态链接库)的全流程。从定位官方参考工程、配置Visual Studio开发环境,到深入解析核心的GenerateKeyEx函数接口,并重点演示了如何修改和实现自定义的种子-密钥安全算法,最终完成DLL的编译、部署与CANoe集成测试,为汽车电子诊断开发提供实战指导。

star5的专栏 535

IntelliJ IDEA环境中的JVM配置

一. Java内存模型(Java Memory Model,JMM)1.运行时数据区:程序计数器(Program Counter Register),本地方法栈(Native Method Stack),堆(Heap),虚拟机栈(VM Stack),方法区(Method Area)二.配置IDEA安装目录/bin/ 有两个文件idea.exe.vmoptions和idea64.exe.vmopti...

顾颜的后花园 9250

别再到处找包了!Keil5芯片支持包(Pack)最全管理指南:安装、更新、迁移与离线备份

本文详细解析了Keil5芯片支持包(Pack)的全生命周期管理,包括安装、更新、迁移与离线备份的工程化解决方案。针对STM32F10x等常见芯片,提供了高效获取Pack的策略、版本管理技巧及团队协作方案,帮助开发者解决常见的'Device Family Pack missing'等问题,提升嵌入式开发效率。

weixin_28729205的博客 541

9 硬件工程师笔面试高频知识考点真题解析——运算放大器

运算放大器(运放)摘要 运放是一种高增益、差分输入的模拟集成电路,具有虚短(线性区输入电压相等)和虚断(输入电流为零)特性,支持负反馈(线性放大)和开环/正反馈(饱和区比较)两种工作模式。关键特性包括高输入阻抗、低输出阻抗,理想运放参数(如无限增益)与实际参数(如有限带宽)的差异。 选型要点: 信号特性:直流/低频信号关注失调电压(Vos)、温漂;高频信号侧重带宽(GBW)和压摆率(SR)。 电源条件:单/双电源供电、电压范围及功耗需求(如电池设备需低静态电流)。 精度与噪声:微弱信号需低噪声运放,高精度场

XU157303764的博客 1675

win10 MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本

本文转自:https://www.cnblogs.com/ggg-327931457/p/9694516.html 原文没有图片,文字足以说明问题。 MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本 本文主要讲述如何安装 C语言 编译器——MinGW-w64,特点是文章附有完整详细的实际安装过程截图,文字反而起说明提示作用。 编写本文的原因始于我的一个观点:图片可以比文字传达更多的信息,也能让其他人更容易理解作者的意图及思想。因此,我将安装 MinGW-w64 的过程和步

wly_2014的博客 4214

如何调试10G/25G以太网IP自协商/Link Training

如果是40G/50G, 100G以太网,选的是多通道的IP,务必保证两端的通道0是正确对接上的,因为在做自协商的时候,以太网只使用通道0,其它通道需在自协商完成后再加入工作。b. 自协商的工作完全由IP自动完成的,所以只要配置没问题,你只需要耐心等待就可以看到自协商的完成,以an_good_check为标志,并且进入下一步linktraining。c. 在LT的过程中,首先你要等到IP能够锁定LT帧,即frame_lock拉高,然后你就可以进行你自己的LT算法了,与AN不同LT是由客户手动完成的。

qq_43416206的博客 1509

32和64位jvm_我应该使用32位还是64位JVM?

32和64位jvm 这是我在企业软件开发生涯中多次遇到的问题。 我不得不每隔一段时间就提供有关配置特定新环境的建议。 而且,很多时候,手头的问题与“我应该使用32位或64位JVM”有关。 老实说,一开始我只是掷硬币。 而不是给出合理的答案。 (对不起,兄弟!)但是到目前为止,我已经对此收集了更多的见解,并希望与您分享。 第一站–越多越好。 对? 所以–如果64> 32,那么这很容易 ...

最佳 Java 编程 332

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

应该使用32位还是64位的JVM?

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34137799的博客 116

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

下了64位的Java显示是32位_64位系统下同时使用64位和32位的eclipse

32位JDK安装目录是D:\Java\32\jdk1.6.0_1364位JDK安装目录是D:\Java\jdk1.7.0_06JAVA_HOME配置的是JAVA_HOME=D:\Java\32\jdk1.6.0_13然后启动64位的eclipse果断的报错了,报错信息:[Failed to load the JNI shared library "D:\Java\32\jdk1.6.0_13\bi...

weixin_39837207的博客 1149

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

java开发32g内存有必要吗_JVM:32G以上的堆会发生什么

JVM:32G以上的堆会发生什么Published:05 Jan 2015Category:这篇短文主要是想告诉你如果给Oracle JVM配置超过32G的堆会发生什么事情。默认情况下,堆大小在32G以下的话JVM中的引用会占用4个字节。这是JVM在启动的时候就已经决定了的。如果你去掉了-XX:-UseCompressedOops选项的话,当然也可以在较小的堆上使用8字节的引用(但在生产系统中这么...

weixin_39952182的博客 1114

如何知道Java虚拟机JVM是64位JVM还是32位?

本文转自 :https://www.breakyizhan.com/java/3588.html (仅供个人学习参考使用) 第一种确定Java虚拟机JVM是64位JVM还是32位的方法 Sun有一个Java系统属性来确定JVM的位数:32或64: sun.arch.data.model=32 // 32 bit JVM sun.arch.data.model=64 // 64 bit JV...

sinat_35814207的博客 6128

64位系统下同时使用64位和32位的eclipse

32位JDK安装目录是D:\Java\32\jdk1.6.0_13 64位JDK安装目录是D:\Java\jdk1.7.0_06 JAVA_HOME配置的是JAVA_HOME=D:\Java\32\jdk1.6.0_13 然后启动64位的eclipse果断的报错了,报错信息:[Failed to load the JNI shared library "D:\Java\3

jacarri的专栏 7112

64位java内存_32位和64位的JVM应该用哪个?

在选择Java虚拟机的时候,需要从内存和性能两个方面来考虑。首先应该考虑内存的需求。从理论上讲,可以分配给32位JVM的最大堆内存应该为2 ^ 32,也就是4GB,但实际上可用堆内存要小得多。 在不同的操作系统之间又略有不同,例如,Windows中大概为1.5GB,Linux中为2~3GB,Mac OS下更大一些,可以到3.7~3.8。 64位JVM下堆内存的大小最大理论上是2 ^ 64,这个值对...

weixin_32486581的博客 452

由于超过32位java限制,64位操作系统上32位JVM的最大Java堆大小

The question is not about the maximum heap size on a 32-bit OS, given that 32-bit OSes have a maximum addressable memory size of 4GB, and that the JVM's max heap size depends on how much contiguous fr...

weixin_29467373的博客 302

java 64位程序,的Java编程的64位JVM

Few Questions :):How to identify what JVM is currently installed ? (64 bit / 32 bit)Do I need to do some considerations while programming for 64 bit JVM target Platform ?Can my Java code work on 32 bi...

weixin_42509908的博客 147

informatica 32位版本在win7 64位安装问题

手上只有informatica windows 32位版本的软件,操作系统为win7 64bit,初次安装后启动informatica时报错: 同事的解决方法是安装VM,在32位的机器上安装informatica。 实在不喜欢在VM里操作,麻烦还要安装一堆东西操作又不便利,偷懒了,网上查阅资料,据说跟JVM可能有半毛钱关系, 于是察看安装后的目录,发现informatica里面有ja

qingqingxuelang的专栏 4730

java 32位dll,在Java中的64位机器上运行32位dll

I am attempting to use a 3rd-party dll for a program I am writing in java. Unfortunately, it only has 32-bit support. When I attempt to load the dll in a 64-bit VM, I get the following error:Can't loa...

weixin_29473141的博客 602

java 64 access,64位Java无法通过ODBC访问32位MS Access数据库

I've got a new 64-bit laptop and have installed STS 64-bit and Java 64-bit. I'm trying to create an ODBC connection to a 32-bi Microsoft database; however the default Admin tools don't provide a drive...

weixin_39964899的博客 149

64位32位 java 浏览器,所有的Java小程序可以在64位JRE启用浏览器中运行?

I have a java applet, which doesn't run on 64bit systems (browsers & OS are 64Bit) but works perfectly fine on 32bit Client systems. Why the applet fails to execute on 64Bit client system ?解决方案The...

weixin_30260057的博客 166
上一篇: Ruby类名
下一篇: 在多线程下的long和double
weeweee
博客等级 码龄16年 10粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值