应该使用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的后果,但也不要惧怕这一选择。
ENVI 5.6保姆级教程:高分七号DLC影像从打开到融合的完整流程(附避坑指南) 本文详细介绍了ENVI 5.6处理高分七号DLC影像的完整流程,包括环境准备、数据解压、正射校正、图像融合等关键步骤。特别针对国产卫星数据处理的独特挑战,提供了实用的避坑指南和优化技巧,帮助用户高效完成光学影像的预处理和质量提升。 阅读详情

相关推荐

【动态规划】背包问题(详细总结,很全)

暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!背包问题是动态规划(Dynamic Planning) 里的非常重要的一部分,关于几种常见的背包,其关系如下:在解决背包问题的时候,我们通常都是按照如下五部来逐步分析,把这五部都搞透了,算是对动规来理解深入了。二维dp数组01背包,先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历一维dp数组01背包,只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。求组合数:外层遍历物品,内层遍历背包。

m0_51370744的博客 4万+

64位JVM的Java对象头详解

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

吴就业 8156

告别Keil?在Mac上配置STM32CubeIDE + CMSIS-DAP调试器全攻略(含常见报错解决)

本文详细介绍了在Mac平台上配置STM32CubeIDE与CMSIS-DAP调试器的全流程,包括硬件准备、软件安装、工程创建及调试优化。通过实战指南,帮助开发者高效完成STM32开发,解决常见报错问题,提升开发效率。

weixin_30485379的博客 433

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

别再只改config了!YOLO/RT-DETR多通道输入实战:数据集结构、多卡训练与参数优先级避坑指南

本文详细解析了YOLO/RT-DETR模型在多通道输入(如8通道多光谱图像)中的实战应用,涵盖数据集结构优化、数据加载器改造、模型参数调优及多卡训练配置。针对常见的多通道输入报错问题,提供了系统的解决方案和性能优化技巧,帮助开发者高效实现非标准数据格式的适配与训练。

weixin_30955617的博客 397

Verilog实战:手把手教你实现IEEE 754单精度浮点乘法器(附完整代码)

本文详细介绍了如何使用Verilog实现IEEE 754单精度浮点乘法器,包括标准解析、架构设计、Verilog代码实现及优化技巧。通过两级流水线设计,平衡性能与面积,适用于数字信号处理、AI加速器等高性能计算场景。

weixin_33724046的博客 314

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

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

最佳 Java 编程 331

模拟量传输4-20ma电流

大家可能会非常熟悉RS232,RS485,CAN等工业上常用的总线,他们都是传输数字信号的方式。那么,我们用什么方式来传输模拟信号呢?工业上普遍需要测量各类非电物理量,例如温度、压力、速度、角度等,这些都需要转换成模拟量电信号才能传输到几百米外的控制室或显示设备上。工业上最广泛采用的是用4~20mA电流来传输模拟量。 采用电流信号的原因是不容易受干扰,因为工业现场的噪声电压的幅度可能达到数V,但是噪声的功率很弱,所以噪声电流通常小于nA级别,因此给4-20mA传输带来的误差非常小;电流源内阻趋于无穷.

tangdongming的博客 1万+

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

汇付天下聚合支付自助接入全流程详解(附JAVA/非JAVA环境配置指南)

本文详细解析了汇付天下聚合支付的自助接入全流程,涵盖JAVA与非JAVA环境下的实战配置。从接入前准备、架构理解、密钥获取,到JAVA SDK集成、核心支付代码拆解,以及Node.js/Python等环境的裸接口对接、签名生成与异步通知处理,提供了完整的避坑指南和上线检查清单,帮助开发者高效、稳健地完成支付系统集成。

wdx01234567的博客 518

Cesium初级开发教程之三十:Primitive集合

教程示例网站:https://thomaz529.github.io。

484

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

OpenCV自学记录(1)——(一拳超人)图像处理基础(图像获取、图像变化)

学习深度学习进行图像分类和目标检测时,要有一定的图像处理的基础。在学习深度学习之前,看了一本《图像处理技术基础》,现在也忘得差不多了,后悔当初没有整理记录下来。现在整理一下图像处理的常用方法,最后实现一个小项目——基于OpenCV的车牌号识别。 OpenCV自学记录(1)——图像处理基础(一)1、图像获取1.1获取图像数据1.2 获取摄像头图像数据2、图像变化2.1 移动(translation)...

qq_40784418的博客 1455

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

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

最佳 Java 编程 332

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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

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

weixin_34137799的博客 116

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

下了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

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

java学习-【转】32位jvm还是64位jvm?

原文地址:http://flychao88.iteye.com/blog/2145093在早期,JVM只有32位的,众所周知,32位有4G的内存限制。需要注意的是,32位jvm的堆内存实际可设的大小还受操作系统的限制。Hotspot VM,在Windows下,最大的堆内存大约在1.5G左右;在基于较新的linux kernel的Linux系统下,其限制在2.5到3G之间,在早前的linux ker

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值