原文在这里: 32位JVM和64位JVM该如何选择?
32位JVM和64位JVM有一些显著的不同,同时也还有一些细微的差异,本文将以问答的形式给大家说明一下。
1.开发应用之前是否需要深入理解32位和64位JVM的区别?
如果你的应用对性能要求并不是特别及其的严格,那么你可以忽略他们的区别。二者之间的细微的差别对你来说几乎没啥影响。
2.64位JVM是不是比32位JVM的性能要好?
你可能会认为64位会比32位JVM的性能好,恰恰相反,64位比32位性能略有降低。64位JVM可以寻址更大的内存空间,但是这会带来一点性能上的损耗。同样的应用,从32位SPARC迁移到64位SPARC上会带来10-20%的性能损耗, 在AMD64和EM64T系统上,大概是0-15%的损耗,这取决于应用里面指针的数量。
3.既然64位机JVM有性能损耗为啥还用它呢?
32位JVM的寻址空间只有2^32(4G),也就是说你的进程最大只能使用4G内存。并且由于还存在其他的一些限制,比如说swap空间、内核空间占用、内存碎片等等,实际上jvm可利用的内存要远小于4G。下图列除了32位JVM可用的最大堆内存:
在这里插入图片描述
但是,如果是64位JVM,寻址空间最大是2^64,几乎就是无限大了!
4.64位JVM为啥比32位JVM会有性能损耗?
这是因为64位JVM的每一个native指针都占用8个字节,而在32位JVM中只有4字节。加载这些额外的字节会影响内存的占用,会带来多大的性能损耗取决于加载的指针的数量。一个好消息是AMD64和EM64T平台运行在64位模式下的时候,JVM可以使用额外的寄存器来产生更高效的native指令,这些寄存器可以把JVM性能提升到几乎跟32位一样。
5.当从32位切换到64位JVM的时候,需要考虑哪些事情?
(1)GC停顿时间
从32位切换到64的主要原因就是为了使用更大的内存,当内存增大了之后,GC停顿时间自然而然的也会跟着变大,因为现在内存中有更多的垃圾需要来回收了。因此,在切换之前,首先要做GC调优,否则你的应用就可能会出现长时间的GC停顿。
(2)JNI本地库
如果你的应用使用了JNI来访问本地库,也需要升级你的本地库,因为32位JVM只能使用32位本地库,64位JVM只能使用64位本地库。
6.CompressedOops是干嘛用的?跟32位还是64位有关系吗?
CompressedOops和32位还是64位JVM是有关系的。我们在定义一个对象的时候,对象是包含数据的。当一个对象在内存中分配的时候,它不仅包含数据还包含了对象头。JVM需要用对象头来做很多事情比如加锁、垃圾回收、虚拟方法调用等等,32位JVM下的对象头占8个字节,64位JVM下对象头占16个字节。多出来的8个字节听上去好像并不多,但是你的应用中可是有成千上万的对象的,加起来这个数量就非常庞大了!
我们可以用CompressedOops这个参数来减轻这个问题,当传递了这个参数以后,64位JVM会很聪明的来决定对象头是用16个字节还是12个字节,当堆内存小于32G的时候,对象头会占用12个字节,大于32G就会占用16个字节。
需要说明一下,Java SE 6u23以后这个参数默认已经设置,之前的版本才需要手动设置。
7.啥时候选32位?啥时候选64位?
如果应用的堆内存小于2G那就选32位
如果应用的堆内存大于2G那就选64位
8.如何知道自己的JVM是32还是64位?
使用命令行:java -version
64位输出类似下面,包含64Bit这样的字眼:
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位输出则没有64Bit:
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");
9.可以在64位OS上运行32位JVM吗?
32位OS只能运行32位JVM,64位OS既可以运行32位JVM也可以运行64位JVM。
10.32位JVM上编译的程序可以运行在64位JVM上吗?
java设计之初的口号就是一次编写出处运行,class字节码是不区分32位还是64位的。
原文在这里:https://blog.gceasy.io/2019/05/31/does-32-bit-or-64-bit-jvm-matter-anymore/
网友评论