下一篇:深入理解Java虚拟机—Java虚拟机内存
前言
之前跟着咕泡学院的老师听了三天的jvm公开课(因为买不起vip课,所有只能白嫖三天公开课了),之前也发了两篇jvm的文章,勉强算是jvm入门了吧,趁着对jvm的热爱,趁热打铁,然后买了一本深入Java虚拟机,虽然我现在的水平学起来可能会有压力,但是我会细嚼慢咽的把这本书啃完
一. 先看下这本书讲的什么:
全书共分为五大部分,围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行了全面而深入的分析,深刻揭示了JVM的工作原理。*部分从宏观的角度介绍了整个Java技术体系、Java和JVM的发展历程、模块化,以及JDK的编译,这对理解本书后面内容有重要帮助。第二部分讲解了JVM的自动内存管理,包括虚拟机内存区域的划分原理以及各种内存溢出异常产生的原因;常见的垃圾收集算法以及垃圾收集器的特点和工作原理;常见虚拟机监控与故障处理工具的原理和使用方法。第三部分分析了虚拟机的执行子系统,包括类文件结构、虚拟机类加载机制、虚拟机字节码执行引擎。第四部分讲解了程序的编译与代码的优化,阐述了泛型、自动装箱拆箱、条件编译等语法糖的原理;讲解了虚拟机的热点探测方法、HotSpot的即时编译器、编译触发条件,以及如何从虚拟机外部观察和分析JIT编译的数据和结果;第五部分探讨了Java实现高效并发的原理,包括JVM内存模型的结构和操作;原子性、可见性和有序性在Java内存模型中的体现;先行发生原则的规则和使用;线程在Java语言中的实现原理;虚拟机实现高效并发所做的一系列锁优化措施。
二. 学了之后,我能得到什么
1. 真正意义的深入理解jvm,jvm是什么,那可是Java的核心啊,我的乖乖,吊打面试管的东西
2. jvm调优 肯定不在话下,jvm调优是干什么,肯定还是拿来吊打面试官(面试官:我又被吊打了?),装x
3. 人要往高处走,代码要往底层学,主要还是用来升职加薪
总结: 读了不后悔系列
三. 不废话了,直接进入今天的学习(怎么有点像网抑云时间)
因为是第一章节的内容大多数都是概念性的东西,感觉可有可无吧,面试基本也不会问到,
主要是讲了Java的历史,sun公司的大起大落,jvm发展史,以及各种Java虚拟机
1.Java历史(作为一名Java程序员要是不知道Java的历史,说出去会被嘲笑死)
- 1995年Oak语言更名为Java,并且在SunWorld大会上正式发布Java1.0
- 1996年1月23日,JDK 1.0发布,Java语言有了第一个正式版本的运行环境。
- 1997年2月19日,Sun公司发布了JDK 1.1
- 1998年12月4日,JDK迎来了一个里程碑式的版本JDK 1.2
- 在1999年3月和7月,分别有JDK 1.2.1和JDK 1.2.2两个小版本发布。
- 1999年4月27日,HotSpot虚拟机发布,HotSpot最初由一家名为“Longview Technologies”的小公司开发,因为HotSpot的优异表现,这家公司在1997年被Sun公司收购了。HotSpot虚拟机发布时是作为JDK 1.2的附加程序提供的,后来它成为了JDK 1.3及之后所有版本的Sun JDK的默认虚拟机
- 2000年5月8日,工程代号为Kestrel(美洲红隼)的JDK 1.3发布
- 2002年2月13日,JDK 1.4发布,工程代号为Merlin(灰背隼)
- 2002年9月16日发布的工程代号为Grasshopper(蚱蜢)的JDK 1.4.1
- 2003年6月26日发布的工程代号为Mantis(螳螂)的JDK 1.4.2
- 2004年9月30日,JDK 1.5发布,工程代号Tiger(老虎)
- 2006年12月11日,JDK 1.6发布,工程代号Mustang(野马)
- 2006年11月13日的JavaOne大会上,Sun公司宣布最终会将Java开源
- 2009年2月19日,工程代号为Dolphin(海豚)的JDK 1.7完成了其第一个里程碑版本
- 2011年7月28日,Oracle公司发布Java SE 1.7
- 2014年3月18日,Oracle公司发表Java SE 1.8
额,有点多,就不继续往下写了
2. 虚拟机家族
2.1 虚拟机始祖 SunClassic/Exact VM
- 早在1996年Java1.0版本的时候,Sun公司发布了一款名为Sun Classic VM的Java虚拟机,它同时也是世界上第一款商用Java虚拟机,JDK1.4时完全被淘汰。
- 这款虚拟机内部只提供解释器
- 如果使用JIT编译器,就需要进行外挂。但是一旦使用了JIT编译器,JIT就会接管虚拟机的执行系统。解释器就不再工作。解释器和编译器不能配合工作。
- 现在hotspot内置了此虚拟机。
- Exact VM的编译执行系统已具备现在高性能虚拟机的雏形,如热点探测,两级即时编译器,编译器,和解释器混合工作模式等
- Exact VM使用因它使用准确式内存管理而得名,准确式内存管理是指虚拟机知道内存中某个位置的数据具体是什么类型
2.2 武林盟主 HotSpot VM
- 由一家名为“Longview Technologies”的小公司设计的; 甚至这个虚拟机最初并非是为Java语言而开发的,它来源于Strongtalk VM, 而这款虚拟机中相当多的技术又是来源于一款支持Self语言实现“达到C语言50%以上的执行效率”的目标而设计的虚拟机, Sun公司注意到了这款虚拟机在JIT编译上有许多优秀的理念和实际效果,在1997年收购了Longview Technologies公司,从而获得了HotSpot VM。
- 目前使用范围最广的Java虚拟机
- HotSpot VM既继承了Sun之前两款商用虚拟机的优点(如前面提到的准确式内存管理),也有许多自己新的技术优势, 如它名称中的HotSpot指的就是它的热点代码探测技术(其实两个VM基本上是同时期的独立产品,HotSpot还稍早一些,HotSpot一开始就是准确式GC, 而Exact VM之中也有与HotSpot几乎一样的热点探测。
- 在2006年的JavaOne大会上,Sun公司宣布最终会把Java开源,并在随后的一年,陆续将JDK的各个部分(其中当然也包括了HotSpot VM)在GPL协议下公开了源码, 并在此基础上建立了OpenJDK。这样,HotSpot VM便成为了Sun JDK和OpenJDK两个实现极度接近的JDK项目的共同虚拟机。
- 在2008年和2009年,Oracle公司分别收购了BEA公司和Sun公司,这样Oracle就同时拥有了两款优秀的Java虚拟机:JRockit VM和HotSpot VM。 Oracle公司宣布在不久的将来(大约应在发布JDK 8的时候)会完成这两款虚拟机的整合工作,使之优势互补。 整合的方式大致上是在HotSpot的基础上,移植JRockit的优秀特性,譬如使用JRockit的垃圾回收器与MissionControl服务, 使用HotSpot的JIT编译器与混合的运行时系统。
- 到了2014年的JDk8时期,里面的HotSpot就已是两者融合的结果,HotSpot在这个过程中里移除了永久代,吸收了JRockit的 Java Misson Contro监控工具等功能
2.3 小家碧玉 Mobile/Embedded VM
——专门针对移动设备或者嵌入式设备的虚拟机。
2.4 天下第二 BEA JRockit/IBM J9 VM
- JRockit曾经号称是“世界上最快的Java虚拟机”,JRockit VM倾向于使用更多的本机内存来换取更好的性能。 JRockit没有解释模式(仅编译),因此,由于其额外的本机内存需求,进程大小倾向于使用比等效Sun JVM大小大数百MB的大小。
- ibm J9到现在仍旧非常活跃,J9的职责分离和模块化做的比HotSpot更优秀,由J9虚拟机中抽象封装出来的核心组件库(包括垃圾收集器,即时编译器,诊断监控子系统等)就单构成了 IBM OMR项目,可以在其他语言平台如Ruby,python中快速组装成相应的功能。
- IBM公司的J9。后来开源捐献给了Eclipse基金会,更名为OpenJ9。
2.5 软硬合璧 BEA Liquid VM/Azul VM
- Liquid则是BEA针对自家Hypervisor系统上JRockit的虚拟化版本,自身成为系统直接控制硬件最大效能发挥能力,随着JRockit虚拟机的终止开发, Liquid VM也已经停止了
- Azul是Hotspot针对Azul公司专有硬件Vega系统而优化的硬件平台虚拟机
2.6 挑战者 Apache Harmony/Google Android Dalvik VM
- Apache Harmony是 apache软件基金会旗下以Apache License 协议开源的实际兼容 jdk1.5和jdk1.6的Java程序运行平台,它含有自己的虚拟机和Java类库的api,用户可以在上面运行 Eclipse ,tomcat,maven等常用的Java程序,但是它并没有通过TCK认证。
- Dalvik VM并不是一个Java的虚拟机,它并没有遵循《Java虚拟机规范》,不能直接执行Java的.class文件,使用寄存器架构而不是Java虚拟机常见的栈架构,但是他和Java有千丝万缕的关系,他执行的DEX可以通过Class文件转化而来,使用Java语法编写应用程序,可以直接使用Java绝大多数Api
- 到了安卓4.4时代,支持提前编译的ART虚拟机迅速崛起,在当时性能还不算特别强大的移动设备上提前编译要比即使编译更容易获得高性能,所以在安卓5.0里ART就全面代替了Dalvik虚拟机
2.7 没有成功,但并非失败 Microsoft JVM 及其他
- 微软为了在IE3浏览器中支持Java Applets,开发了Microsoft JVM。Microsoft JVM只能在windows平台下运行,但确实是当时windows平台上性能最好的java虚拟机。
- 1997年,Sun指控微软侵犯商标成功,微软赔了Sun公司高达10亿美元,微软在windows XP SP3中抹除了其VM。现在windows安装的jdk都是HotSpot虚拟机