把JVM揉碎了,碾成末的去理解(一)

把JVM揉碎了碾成末的去理解

前因后果

一直想学习JVM,明知道JVM有用,做Java的不了解JVM可以满足日常开发,甚至能写出业务逻辑很有艺术感的代码,但不可能把代码质量提高写出高性能的代码,我敢打包票的说,如果你不揉碎了理解JVM,指定写不出适合虚拟机的代码。
可是呢,从有想法学到目前为止,也立了很多次志向一定要把JVM学好,一定要做个知道原理懂得底层的资深软件工程师,到头来的结果都是什么也没有得到,了解到的仅仅是寥寥一些名词知识。根本不成系统,知道的知识不值得推敲。现在撂下话,不管咋地,就是把书上的字一个个的敲也要敲在博客上。

什么是JVM

在学习java的第一节课我们都知道老师讲一下java的优点"面向对象的语言"、"一次编译,到处运行"等等优点,这个到处运行就是运行在JVM上,不管是Linux还是windows系统,都是依赖于JVM才能解析java的class文件即字节码。
那么JVM是啥呢?JVM是java虚拟机,可以看做一台抽象的计算机,如同真实的计算机那样,它有自己的指令集以及各种运行时内存区域。其实就是个中介机构,负责解析读取字节码的指令来控制计算机底层,运行一些结果,交由调用者。
知道吗?JVM不是只支持java语言的字节码,Java 虚拟机与 Java 语言并没有必然的联系,它只与特定的二进制文件格式——Class 文件格式所关联, Class 文件中包含了 Java 虚拟机指令集(或者称为字节码、 Bytecodes)和符号表,还有一些其他辅助信息。其实它还支持Clojure、JRuby、Groovy等语言的字节码,我们能看懂的java文件转换为我们不怎么能看懂的class文件,JVM只能看懂class文件,JVM不关注,你是什么语言产生的,只要你符合我的标准我JVM就可以帮你解析帮你运行。
JVM的发展史,JVM可以说是百家争鸣,有很多虚拟机厂商发布了N多种虚拟机,其中这些虚拟机具有代表性

  • Sun Classic VM 是世界上第一款商用Java虚拟机
  • Exact VM 即时编译器、编译器与解释器混合工作模式
  • Sun HotSpot VM,适用于 OpenJDK和Sun JDK
  • Apache Harmoney/Goole Andriod Dalvik VM
  • Mircrosotf JVM 以及其他

等等等虚拟机,这些虚拟机都是程序员进步的阶梯呀。
各种虚拟机的实现也是使用各种语言,这就说明了语言没有好坏,只是看适用的什么场景下。

虚拟机的实现

如果只是要去“正确地”实现一台 Java 虚拟机,其实并不如大多数人所想的那样高深和困难——只需要正确读取 Class 文件之中每一条字节码指令,并且能正确执行这些指令所蕴含的操作即可。

64位虚拟机

Java 程序运行在64位虚拟机上需要付出较大的额外代价,一个是内存问题,指针膨胀和各种数据类型对齐补白,64位系统通常比32位系统额外增加10%~30%的内存。另外64位虚拟机运行速度落后于32位虚拟机速度,两者大约有15%左右的性能差距。
由于企业现在经常用到超过4GB的内存,对于虚拟机的需求非常迫切的
为啥说内存超过4GB就要使用64位内存呢?

查阅资料显示

理论上来说32位的JVM有4G的堆大小限制。但是因为各种条件限制比如交换区,内核地址空间使用,内存碎片,虚拟管理机的管理开销,实际上可用的堆的大小远远比理论上的4G要少。
在32位windows的机器上,堆最大可以达到1.4G至1.6G。
在32位solaris的机器上,堆最大可以达到2G
而在64位的操作系统上,32位的JVM,堆大小可以达到4G

使用java参数-xms -xmx定义堆大小的时候

  1. 如果是32bit的jvm超过4G肯定是没用的,定义了4G,最终使用到的可能只有2G
  2. 这两个值最好定义成一样,可以减少java gc的操作,有小幅度性能提高

HotSpot虚拟机

HotSpot虚拟机是用C/C++编写的,入口是java.c的main方法。

32位和64位虚拟机的区别这个还要再研究研究

参考:
https://zyslovely.iteye.com/blog/1464820
《深入理解Java虚拟机》第二版 周志明老师

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值