在毕业之后,就一直想学习下JVM,来补足自己知识面的欠缺,但是没有一个系统的教程去作为学习资料,自己读书的话,又比较苦涩难懂、耗时巨长,哈哈,这可能是给自己懒能找到的最好的理由吧!
但是前几天在B站无意间刷到了宋红康老师的视频,感觉特别有喜感,听了几节,还不错,就果断拿下作为JVM学习的一个辅学素材,再搭配一本《JVM从入门到精通》的书,一个自己的JVM系列教程由此横空出世,希望各位C粉能够喜欢,从中学习到知识,共同进步!!!
上张宋老师的帅照(图片来源与百度百科,如有侵权,联系删除),是不是特有喜感,这可能也是我用他的系列视频作为教程的主要原因吧,哈哈!!!
这个JVM系列教程分为三个主要部分,分别对JVM的性能调优与垃圾回收、和各个监控软件的使用做了详细的说明如下图:
- JVM上篇:内存与垃圾回收
- JVM中篇:字节码与类的加载
- JVM下篇:性能监控与调优
接下来各就各位 开始上正菜…
- 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM!
- 想解决线上JVM GC的问题,却无从下手
- 新项目上线,对各种JVM参数设置一脸茫然,直接默认吧,然后就JJ了
- 每次面试之前都要重新背一遍JVM的一些原理,然后当问及项目中如何进行JVM调优的?如何解决GC、OOM的问题时,一脸懵逼
大部分Java开发人员,除会在项目中使用到与Java平台相关的各种高精尖技术,对于Java技术的核心Java虚拟机了解甚少。
1.2 开发人员如何看待上层框架- 一些有一定工作经验的开发人员,打心眼里觉得SSM、微服务等上层技术才是重点,基础技术并不重要,这其实是一种本末倒置的“病态”
- 如果我们把核心类库的API比做数学公司的话,那么Java虚拟机的知识就好比公式的推导过程。
- 架构师每天在想些什么?
应该如何让我的系统更快
如何避免系统出现瓶颈
理由一
- 面试的需要(功利):BAJT、TMD、PKQ等面试都爱问
- 项目的需要(实操): 中高级程序员的必备技能,项目管理、调优
- 追求极客的精神(精神):比如垃圾回收算法、JIT、底层原理
无论从那个方面,好像都可以成为我们学习的理由和动力
理由二
- 垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得JVM内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是Java工程师进阶的必备能力。
- 拥有一定开发经验的Java平台开发人员
- 软件设计师、架构师
- 系统调优人员
- 有一定的Java编程基础并希望进一步理解Java的程序员
- 虚拟机爱好者,JVM实践者
以上就是目前主流的可以在JVM上面运行的9种语言。加上Java正好10种。如果你是一个Java开发,那么有必要掌握以上9中的一种,这样可以在一些有特殊需求的场景中有更多的选择。
以上的语言都是按照Java虚拟机规范进行编写的,所以编写后的程序都能够下虚拟机上运行,Java虚拟机只关心字节码文件
Java不是最强大的语言,但是JVM是最强大的虚拟机
2.2 字节码文件上面我们说过,java语言跨平台是由于字节码格式是一样的,JVM能够识别其他语言按照规范所编译生成的字节码文件。
- 我们平时说的java字节码,指的是java语言编译成的字节码。准确的说任何在jvm平台上执行的字节码格式都是一样的,所以应该统称为:jvm字节码
- Java虚拟机与Java语言并没有必然的联系,它只与特定的二进制文件格式—class文件格式所关联,class文件中包含了JAVA虚拟机指令集(或称为字节码、bytecodes)和符号表,还有一些其他辅助信息。
由于JVM虚拟可以运行所有按照按规范编写的语言,而各个语言有着自己在特定领域的优点,所以多语言混合编程将成为主流,使用特定领域的语言去解决特定领域的问题是当前软件开发应对日趋复杂的项目需求的一个方向。
2.4 如何真正搞懂JVM?试想一下,在一个项目之中,并行处理用Clojure语言编写,展示层使用JRuby/Rails,中间层则是Java,每个应用层豆浆使用不同的编程语言来完成,而且,接口对每一层的开发者都是透明的,各种语言之间的交互不存在任何困难,就像使用自己语言的原生API一样方便,因为他们最终都运行在一个虚拟机上。
Java 虚拟机非常复杂,要想真正理解它的工作原理,最好的方式就是自己手动编写一个!
自己手写一个Java虚拟机难吗?
天下事有难易乎?
为之,则难者亦易矣;不为,则易者亦难矣
- 1990年,在 sun 计算机公司中,由 Patrick Naughton、Mikesheridan及James Gosling领导的小组Green Team,开发出的新的程序语言,命名为oak,后期命名为Java
- 1995年,sun正式发布Java和HotJava产品,Java首次公开亮相。1996年1月23日sun Microsystems发布了JDK 1.0。
- 1998年,JDk .2版本发布。同时,sun发布了JsP/servlet、EJB规范,以及将Java分成了J2EE、J2SE和ld2ME。这表明了Java开始向企业、桌面应用和移动设备应用3大领域挺进。
- 2000年,JDK 1.3发布,Java HotSpot Virtual Machine正式发布,成为Java的默认虚拟机。
- 2002年,JDK 1.4发布,古老的classic虚拟机退出历史舞台。
- 2003年年底,Java平台的scala正式发布,同年Groovy也加入了Java阵营。2004年,JDK 1.5发布。同时JDK 1.5改名为JavaSE 5.0。
- 2006年,JDK 6发布。同年,Java开源并建立了openJDK。顺理成章,Hotspot虚拟机也成为了openJDK中的默认虚拟机。
- 2007年,Java平台迎来了新伙伴clojure。
- 2008 年,oracle收购了BEA,得到了JRockit虚拟机。
- 2009年,Twitter宣布把后台大部分程序从Ruby迁移到scala,这是Java平台的又一次大规模应用。
- 2010年,oradle收购了sun,获得Java商标和最具价值的Hotspot虚拟机。此时,oracle拥有市场占用率最高的两款虚拟机Hotspot和JRockit,并计划在未来对它们进行整合: HotRockit
- 2011年,JDK7发布。在JDK 1.7u4中,正式启用了新的垃圾回收器G1。2017年,JDK9发布。将G1设置为默认Gc,替代cMs
- 同年,IBM的J9开源,形成了现在的open J9社区
- 2018年,Android的Java侵权案判决,Google赔偿oracle计88亿美元
- 同年,Oracle宣告JavaEE成为历史名词,JDBC、JMs、Servlet赠予Eclipse基金会同年,JDK11发布,LTs版本的JDK,发布革命性的ZGc,调整JDK授权许可
- 2019年,JDK12发布,加入RedHat领导开发的shenandoah cc
下一篇我们将讲对虚拟机进行详细介绍
推荐阅读
上一篇:Netty核心技术从入门到精通
下一篇:二、JVM从入门到精通之虚拟机详解



