在本文中找到有关于32位JVM和64位JVM之间的区别的一些常见问题的答案。你将学到在这两者之间进行迁移时要考虑的所有事情,将有助于你更好地实施。
32位JVM和64位JVM之间存在一些明显的区别和细微差别。我将尝试通过此问答文章来澄清它们。
我们是否需要了解32位JVM和64位JVM之间的区别?
如果你不是在构建性能型Java服务,则不必了解它们之间的区别。32位JVM和64位JVM之间的细微差别不会对你的Java服务产生太大影响。
64位JVM的性能是否优于32位JVM?
我们大多数人认为64位大于32位,因此64位JVM性能将优于32位JVM性能。其实不然,事实并非如此。与32位JVM相比,64位JVM的性能可能会有所下降。以下是Oracle JDK文档中有关64位JVM性能的摘录:
通常,与在32位VM上运行同一应用程序相比,能够处理大量内存的好处是64位VM的性能损失较小。当你迁移到64位VM时,将在64位平台上运行的应用程序与在SPARC上的32位平台运行的应用程序相比,性能差异降低了10-20%。在AMD64和EM64T平台上,此差异范围为0-15%,具体取决于访问应用程序所执行的指针的数量。”
如果性能受到影响,为什么有人会使用64位JVM?
在32位JVM中,最大可寻址内存空间仅为2 ^ 32(即〜4gb)。这意味着Java进程的最大内存大小不能超过4GB。实际上,由于各种其他限制(例如可用交换,内核地址空间使用,内存碎片和VM开销),该限制要低得多。下表总结了可以在32位JVM上设置的最大堆大小(即-Xmx):
而如果你在64位JVM上运行应用程序,则最大可寻址内存空间为2 ^ 64(即... 没算出来--_--)。这意味着你的应用程序的最大可寻址内存大小接近无限。
为什么64位JVM性能可能比32位JVM慢
这是由于以下事实:系统中的每个本机指针占用的是8个字节而不是4个字节。此额外数据的加载对内存使用有影响,这取决于执行过程中加载了多少个指针,从而导致执行速度稍慢。
好消息是,由于以64位模式运行的AMD64和EM64T平台,Java VM获得了一些额外的寄存器,可用于生成更有效的本机指令序列。比较32位和64位执行速度时,这些额外的寄存器将性能提高到通常根本没有性能损失的地步。
从32位JVM迁移到64位JVM时需要考虑哪些事项?
GC Stop World时间
从32位JVM迁移到64位JVM的主要原因是要获得较大的堆大小(即-Xmx)。当增加堆大小时,GC暂停时间会自动开始变长,因为现在内存中有更多垃圾需要清除。在进行迁移之前,你需要进行适当的GC调整,否则,你的应用程序可能会经历几秒钟到几分钟的暂停时间。于此同时,有一个专门的GC分析网站可以供你去配置使用GCeasy
Native library
如果你的应用程序使用Java本机接口(JNI)访问本机库,那么你还需要升级Native library,因为32位JVM只能使用32位Native library。同样,64位JVM只能使用64位Native library。
什么是CompressedOops?它与32位,64位JVM有关吗?
是的,CompressedOOps与32位和64位JVM有关。
我们用数据字段定义对象。当在内存中创建该对象以及数据字段时,还将创建对象标头。JVM需要对象标头来执行内部处理,虚拟方法调用,垃圾回收,锁定等。
在32位JVM中,此对象标头占用8个字节;在64 位JVM中,该对象标头占用16个字节。增加8个字节听起来可能并不多,但是鉴于你的应用程序在其运行时创建了数百万个对象,将8个字节乘以数百万个对象可能会增加可观的开销。
你可以通过传递XX:+ UseCompressedOops JVM参数来缓解此问题。当你传递此参数时,JVM会做出一个巧妙的技巧,并将对象标头的大小优化为即使在64位中也仅使用12个字节。只要你的JVM堆大小(即-Xmx)小于32GB,此技巧就会起作用。如果超过32 GB,则对象标头大小将再次变为16个字节。
注意:
自Java SE 6u23及更高版本以来,已将-XX:+ UseCompressedOops设置为默认值。仅当你在JDK 6u23或更早版本上运行时,才传递-XX:+ UseCompressedOopsargument。
什么时候应该使用32位和64位JVM?
<2GB内存
:如果你的应用程序的堆大小(即-Xmx)小于2GB,则无需费力地决定。使用32位JVM。
> 2GB内存
:如果你的应用程序需要2GB以上的内存,那也不是明智的决定。使用64位JVM。但是,请进行适当的性能测试以衡量和减轻影响。
如何查找我的应用程序是在32位还是64位JVM上运行?
方法一:在命令提示符下,发出命令:
java -version
如果是64位JVM,你将看到输出包含单词:“64-Bit”。例:
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
如果它是32位JVM,则不会显示单词:“64-Bit”。例:
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) Client VM (build 25.211-b12, mixed mode)
方法二:你从Java程序发出以下语句:
System.out.println(System.getProperty("sun.arch.data.model") + "-bit JVM");
根据JVM类型,适当的版本将被打印在控制台上。
我可以在64位操作系统上运行32位JVM吗?
有32位OS和64位OS。如果你在32位操作系统上运行(这在今天很难找到),则只能运行32位JVM。另一方面,如果你在64位操作系统上运行,则可以在32位JVM或64位JVM上运行应用程序。
如何下载32位JVM或64位JVM?
转到Oracle JDK下载页面时,将看到用于下载特定于你的操作系统的JDK的选项:
如果你选择x86,则将在此处下载32位JVM。如果选择x64,则将下载64位JVM。
在32位JVM上编译的代码可以在64位JVM上运行吗?
我们使用javac即java编译器将Java代码编译为字节代码(即* .class文件)。生成的字节码与32位和64位JVM无关。它可以在两个JVM上运行。记住Java古老的诺言:“Write once, run anywhere”。
如何判断对象可以回收引用计数法弊端:循环引用时,两个对象的计数都为1,导致两个对象都无法被释放可达性分析算法JVM中的垃圾回收器通过可达性分析来探索所有存活的对象扫描堆中的对象,看能否沿着GCRoot对象为起点的引用链找到该对象,如果找不到,则表示可以回收可以作为GCRoot的对象虚拟机栈(栈帧中的本地变量表)中引用的对象。方法区中类静态属性引用的对象方法区中常量引用的对象本地方法栈中JNI(即一般说的Native方法)引用的对象五种引用强引用只有GCRoot都不引用该对象时,才会回收强引用对象如上图B、C对象都不引用A1对象时,A1对象才会被回收软引用当GCRoot指向软引用对象时,在内存不
2022-09-12
阅读(162)
点赞(0)
JVM(JavaVirtualMachine)是java虚拟机,是java上层框架的基础,欲练神功,先练内功!JVM和java体系结构一次编译,到处运行.跨平台不同语言使用编译器后的字节码符合java虚拟机的规范就可以运行.自动内存管理自动垃圾回收JVM的架构模型:栈:跨平台性,指令集小,指令多;执行性能比寄存器差Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。两者的优缺点基于栈式架构的特点:设计和实现更简单,适用于资源受限的系统;避开了寄存器的分配难题:使用零地址指令方式分配指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令
2022-09-25
阅读(156)
点赞(0)
另外,小编也有根据以下总结内容,录制了对JVM讲解视频。里面有个用visio画的JVM内部结构图,每部分的作用都有详细讲解,希望能有帮助。网址:https://edu.csdn.net/lecturer/board/104941.java自动管理堆(heap)和(栈),程序员不能直接的设置堆和栈。3.操作系统的堆和栈:堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。栈(操作系统):由操作系统自动分配释放,存放函数的参数值,局部变量值等。操作方式与数据结构中的栈相类似。2.为什么jvm的内存是分布在操作系统的堆中呢??因为操作系统的栈是操作系统
2022-09-06
阅读(189)
点赞(0)
一、详解JVM内存模型JVM有本地方法栈、虚拟机栈、程序计数器、堆、方法区。JVM内存分为共享区(可以被所有方法(线程)直接访问)和私有区(对线程来说是私有的,其他线程无法直接访问)。在共享区里包含着堆和方法区,在私有区里包含着程序计数器、虚拟机栈和本地方法栈。程序计数器PC:是一个行号计数器,程序在进行跳转时,我们要记住跳转的行号,它方便我们的程序进行还原。虚拟机栈:包含了Java方法执行时的状态,每一个Java方法都会在虚拟机栈里面创建一个栈帧,里面存放局部变量表、操作数栈、动态链接、方法出口等。本地方法栈:跟虚拟机栈类型,在用于调用操作系统的底层方法时才会创建栈帧。堆:用来保存着Java
2022-09-06
阅读(152)
点赞(0)
1、引用计数算法定义:判断一个对象是否受到引用,如果受到一个引用就+1,如果减少一个引用就-1,当计数为0那么久标记为垃圾。弊端:循环引用时,两个对象的计数都为1,导致两个对象计数不能为0,不能被定义为垃圾。2、可达性分析算法JVM中的垃圾回收器通过可达性分析来探索所有存活的对象.扫描堆中的对象,看能否沿着GCRoot对象为起点的引用链找到该对象,如果找不到,则表示可以回收.可以作为GCRoot的对象。【JVM垃圾回收】哪些可以当作GCROOT?3、五种引用1、强引用(A1):只有GCRoot都不引用该对象时,才会回收强引用对象如上图B、C对象都不引用A1对象时,A1对象才会被回收2、软引用当
2022-09-12
阅读(209)
点赞(0)
今天分享一道一线互联网公司必问的面试题。”JVM如何判断一个对象可以被回收“关于这个问题,来看看普通人和高手的回答。普通人:嗯。。。。。。高手:好的,面试官。在JVM里面,要判断一个对象是否可以被回收,最重要的是判断这个对象是否还在被使用,只有没被使用的对象才能回收。引用计数器,也就是为每一个对象添加一个引用计数器,用来统计指向当前对象的引用次数,如果当前对象存在应用的更新,那么就对这个引用计数器进行增加,一旦这个引用计数器变成0,就意味着它可以被回收了。这种方法需要额外的空间来存储引用计数器,但是它的实现很简单,而且效率也比较高。不过主流的JVM都没有采用这种方式,因为引用计数器在处理一些复
2022-09-12
阅读(166)
点赞(0)
JVM简介我们总结出JVM内存包含两个子系统和两个组件,两个子系统是:Classloader子系统和Executionengine(执行引擎)子系统;两个组件分别是:Runtimedataarea(运行时数据区域)组件和Nativeinterface(本地库接口)组件。运行时数据区域包含5部分:方法区,堆,虚拟机栈,本地方法栈,程序计数器JVM的结构JVM内部执行运行流程首先,当一个程序启动之前,它的class会被类装载器装入方法区,执行引擎读取方法区的字节码自适应解析,边解析就边运行(其中一种方式),然后pc寄存器指向了main函数所在位置,虚拟机开始为main函数在java栈中预留一个栈帧
2022-09-06
阅读(222)
点赞(0)
一、JVM体系结构:类装载器ClassLoader:用来装载.class文件执行引擎:执行字节码,或者执行本地方法运行时数据区:方法区、堆、Java栈、程序计数器、本地方法栈JVM把描述类数据的字节码.Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。二、JVM原理:JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序。java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Jav
2022-09-06
阅读(144)
点赞(0)