美文网首页
32位JVM和64位JVM该如何选择?

32位JVM和64位JVM该如何选择?

作者: Joshua1919 | 来源:发表于2019-06-27 13:18 被阅读0次

原文在这里: 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/

相关文章

  • 32位JVM和64位JVM该如何选择?

    原文在这里: 32位JVM和64位JVM该如何选择? 1.开发应用之前是否需要深入理解32位和64位JVM的区别?...

  • jvm深入理解

    一 概要(本文主要参考深入浅出jvm) 1.什么是jvm? 2.jvm是如何分配内存的? 3.jvm是如何保证垃圾...

  • Carson带你学JVM:这是一份全面 & 详细的JVM学习指南

    前言 该如何学习Java虚拟机(JVM)内容?今天Carson给你们奉上一份全面 & 详细的JVM学习指南。 学习...

  • ASM 库的介绍和使用

    前面几篇文章介绍了 .class 文件的结构、JVM 如何加载 .class 文件、JVM 中如何执行方法的调用和...

  • 阿里P8架构师详谈 Java 内存模型

    Java 内存模型(JMM)描述了 JVM 如何使用计算机的内存(RAM)。JVM 是一个完整计算机的模型,因此该...

  • 浅谈 Java 内存模型

    Java 内存模型(JMM)描述了 JVM 如何使用计算机的内存(RAM)。JVM 是一个完整计算机的模型,因此该...

  • 阿里P8架构师详谈 Java 内存模型

    Java 内存模型(JMM)描述了 JVM 如何使用计算机的内存(RAM)。JVM 是一个完整计算机的模型,因此该...

  • JVM

    栈容量由-Xss指定深入理解JVM—JVM内存模型 JVM内存模型和JVM参数的关系

  • py4j 原理与pyspark 交互

    python 如何和java 的JVM通信 最简单的就是RPC. JVM 作为RPC的服务端, python a...

  • 浅谈JAVA虚拟机中的GC

    前言 本文从JVM如何判定对象是否需要回收开始分析,再到JVM的几种垃圾回收思想如何产生,最后再来介绍JVM经典的...

网友评论

      本文标题:32位JVM和64位JVM该如何选择?

      本文链接:https://www.haomeiwen.com/subject/wralcctx.html