大家好,我是极客时间《深入拆解Java虚拟机》作者、Oracle Labs高级研究员郑雨迪。有幸借这个专题的机会,能和大家分享为何Java工程师要学Java虚拟机?如何掌握Java虚拟机?

工欲善其事,必先利其器

“为什么学Java虚拟机”这个问题,就和“为什么要学习数据结构和算法”是一个道理:工欲善其事,必先利其器。

我总结了三点必须要学好Java虚拟机的理由:

  • Java已然是一门主流的工程语言,拥有大量的应用。作为Java语言的执行引擎,Java虚拟机的调优一直是热点话题,成为各大厂面试的压轴题。
  • 此外,主流的Java虚拟机–也就是OpenJDK的HotSpot VM–是完全开源的。只要读得懂C++代码,便能够绕开网络上的“二手”资料,直面Java实现的核心逻辑。
  • Java在不断地增添新特性、新功能,其中不少都“借鉴”自其他编程语言。同样,通过学习Java虚拟机,在遇到其他语言实现时也能够触类旁通,迅速地完成调优、排错工作。

另外,我注意到国内大厂不再只满足于使用开源项目,而是积极参与这些项目的开发。例如Alibaba在去年便已成为OpenJDK项目执行委员会的一员,可以左右Java语言的发展。一旦越来越多的大厂加大对底层、对这些开源项目的投入,势必会产生许多对高精尖技术专家的需求。

所以,作为一名Java程序员,在尽情享受Java虚拟机带来好处的同时,你还应该去了解和思考“这些技术特性是如何实现的”,去了解最底层的原理。只有熟悉JVM,你才能在遇到OutOfMemory等异常时,不会束手无策,不会一脸懵逼的上网找解决办法,最后就算改了几个启动参数解决了问题,也还是云里雾里。

那该如何揭开Java虚拟机迷雾,深入底层,将Java虚拟机拿下?我分为3个阶段来分享,每个阶段大家又该具备哪些技能?

先附上一张我制作的「Java虚拟机知识框架图」,涵盖了Java虚拟机的所有学习要点,建议保存。

一、Java虚拟机新手入门

虽然我们和语言朝夕相处,但不少人提及代码的详细运行过程也难免会一时语塞。这都是由于Java虚拟机封装得太好,让使用者几乎感觉不到它的存在,也导致不少初学者学习Java虚拟机时摸不着头脑,找不到脉络。

Java虚拟机的基本原理及运行机制,对于初学者来说,是必须要掌握的,至少我是这么要求的。不然根基不牢,何来平地高楼起。

所以我也花了一整个模块的篇幅来逐次介绍Java虚拟机的设计决策以及工程实现,让大家在学习Java虚拟机时,可以知其然,也要知其所以然。

以下是专栏里的部分原理内容,大家对照着,看看是否已掌握。

Java代码有很多种运行方式,那Java 虚拟机具体是怎样运行 Java 字节码的?[第1讲 | Java代码是怎么运行的?]
boolean在Java虚拟机是以整数形式表示的–0代表false,1代表true。那么2又代表什么呢?为什么要这样设计?[第2讲 | Java的基本类型]

二、进阶Java虚拟机

告别了GRUD研究员,如果你想再进一步进阶,那么以下是知识点是你必须要掌握的。弄懂了这些,你基本上掌握了面试官80%的问题。

怎么判定对象已经“死去”?垃圾回收的原理是什么? [第11讲 | 垃圾回收(上)]
Java虚拟机的堆是如何划分的?[第12讲 | 垃圾回收(下)]

当然,我希望大家能系统学习Java虚拟机,而不是为了面试去刷题。更要的是希望这个专栏能激发出大家学习Java虚拟机乃至其他底层工作、前沿工作的热情。

就像我开设这个专栏一样,为不辜负大家的信任,我几乎每篇专栏都会大量阅读HotSpot的源代码,和同事讨论实现背后的设计理念,在这个过程中,我也发现了一些HotSpot中的Bug,或者年久失修的代码,又或者是设计不合理的地方。苦中有乐,忙碌中又有惊喜。

三、Java虚拟机高手

在我的专栏中,有一条令我印象颇深的留言,讲的是他如何解决反射调用效率低下的问题。之所以印象深刻,是因为他的做法和Java虚拟机中附带的自动优化方式完全一致。换个角度来看,他其实已经具备为Java虚拟机设计优化的能力,也完全可以将这一优化实现回馈给OpenJDK社区。

举一反三,主动的解决问题,且能回馈开源。这必然是高手需要具备的能力之一。

这时候大家必须去想的一个问题:如何让Java(以及其他Java虚拟机语言,如Scala、Kotlin等)跑得更快?

主要分三个方面去考虑:

什么是虚方法调用?如何消除虚方法调用开销?[第20讲 | 方法内联]
Java虚拟机是如何进行硬件加速的?[第22讲 | HotSpot虚拟机的intrinsic]
我需要手工避免new语句吗?[第23讲 | 逃逸分析]

再之,Java虚拟机有很多工具,需要大家熟练掌握,比如javap–能够将class文件反汇编人类可读格式的工具;OpenJDK项目Code Tools–包含了好几个实用小工具,又或者是ASM–Java 字节码框架等等。

在专栏里,我专门有几篇文章来介绍各类工具的使用:

如何通过注解处理器自动生成业务逻辑?[第27讲 | 注解处理器]
如何标准化地衡量程序性能? [第28讲 | 基准测试框架]

作者介绍

郑雨迪,甲骨文实验室(Oracle Labs)的高级研究员,主要负责研究如何通过程序分析技术以及动态编译技术让程序语言跑得更快。同时,也是全栈虚拟机Graal编译器的核心开发者之一,在为HotSpot虚拟机项目添砖加瓦。

通过学习《深入拆解Java虚拟机》,你将获得:

  • Java工程师进阶加薪必修课
  • 4大模块全方位拆解JVM
  • 帮助你编写高效Java代码
  • 揭秘Oracle最新的Java黑科技

戳此订阅:《深入拆解Java虚拟机》这个专栏涨价倒计时最后5天,从 68元直接涨到 99元,现参团只要 58元。

写给Java程序员的Java虚拟机学习指南的更多相关文章

  1. Java程序员值得拥有的TreeMap指南

    先看再点赞,给自己一点思考的时间,微信搜索[沉默王二]关注这个有颜值却假装靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题 ...

  2. Java 程序员的大数据入门指南

    项目 GitHub 地址:https://github.com/heibaiying/BigData-Notes ✒️ 前 言 大数据常用技术栈思维导图 大数据常用软件安装指南 一.Hadoop 分布 ...

  3. Java程序员壁纸-Java开发

  4. 聊聊阿里社招面试,谈谈“野生”Java程序员学习的道路

    引言 很尴尬的是,这个类型的文章其实之前笔者就写过,原文章里,笔者自称LZ(也就是楼主,有人说是老子的简写,笔者只想说,这位同学你站出来,保证不打死你,-_-),原文章名称叫做<回答阿里社招面试 ...

  5. 一个java程序员的年终总结

    年底了,该给自己写点总结了! 从毕业到现在已经快4年啦,一直在Java的WEB开发行业混迹.我不是牛人,但是自我感觉还算是个合格的程序员,有必要写下自己将近4年来的经历,给自我以提示,给刚入行的朋友提 ...

  6. 一个工作了四年的java程序员的心得体会

    年底了,该给自己写点总结了!从毕业到现在已经快4年啦,一直在Java的WEB开发行业混迹.我不是牛人,但是自我感觉还算是个合格的程序员,有必要写下自己将近4年来的经历,给自我以提示,给刚入行的朋友提供 ...

  7. java程序员笑不死的经历ส้้้้้้้้้

    ส้้้้้้้้้้ส้้้้้้้้้้ส้้้้้้้้้ 1.程序猿最烦两件事,第一件事是别人要求他给自己的代码写文档,第二件呢?是别人的程序没有留下文档. 2.宪法顶个球!中国的法律都是.t ...

  8. 程序员的幽默-献给所有Java程序员

    1. 一程序员去面试,面试官问:“你毕业才两年,这三年工作经验是怎么来的?!”程序员答:“加班.” 2. 某程序员对书法十分感兴趣,退休后决定在这方面有所建树.于是花重金购买了上等的文房四宝.一日,饭 ...

  9. 关于如何成为高级java程序员

    今日,对如何进一步提升java.成为一个高级的程序员有了兴趣,在网上看到一篇回答,感觉不错,记下来 总结了以下六点:一.JAVA基础 要想成为高级Java程序员,Java是一定要学习的.要成为高级程序 ...

随机推荐

  1. HTTP协议的学习总结

    HTTP:HyperTextTransferProtocol是一种超文本传输协议,协议用在本地浏览器和服务器之间通信 HTTP基于TCP/IP传输数据,如图片,HTML文件 1.HTTP协议特点: 无 ...

  2. MVC分层设计

    MVC分层设计 什么是MVC? MVC 是一种软件架构模式,利用分层的思想来设计交互式应用程序,由以下3层组成: Model 业务模型层. View 展示层. Controller 控制层. MVC包 ...

  3. mpvue-新建页面、页面跳转、自适应单位

    1.mpvue怎么新建页面? (1)粘贴复制一个页面文件夹,只需要改文件夹名- 文件名不需要改,main.js里的东西不用动.export default里更改局部顶部栏配置. (2)index.vu ...

  4. flask-文件上传的使用

    flask-文件上传 在flask中使用request.files.get来获取文件对象 对获取到的文件对象可以使用save(filepath)方法来保存文件 上传的文件在保存前需要对文件名做一个过滤 ...

  5. Typora+PicGo+GitHub实现md自带图床效果

    1 GitHub创建作为图床的仓库 1.1 在GitHub中创建一个仓库 注意仓库要是public的,不然上传的图片还是无法使用的.如果不知道怎么创建仓库,可以百度一下. 1.2 在GitHub生成一 ...

  6. JUC——检视阅读

    JUC--检视阅读 参考资料 JUC知识图参考 JUC框架学习顺序参考 J.U.C学习总结参考,简洁直观 易百并发编程,实践操作1,不推荐阅读,不及格 JUC文章,带例子讲解,可以学习2 Doug L ...

  7. 智能指针 unique_ptr

    unique_ptr 不共享它的指针.它无法复制到其他 unique_ptr,无法通过值传递到函数,也无法用于需要副本的任何标准模板库 (STL) 算法. 1.不能进行复制构造和赋值操作(unique ...

  8. (一) Mybatis源码分析-解析器模块

    Mybatis源码分析-解析器模块 原创-转载请说明出处 1. 解析器模块的作用 对XPath进行封装,为mybatis-config.xml配置文件以及映射文件提供支持 为处理动态 SQL 语句中的 ...

  9. Floyd-例题-实现-我的第一篇博客

    https://www.cnblogs.com/lbssxz/p/11014911.html 这是网上看到的题目,以上是原博主的解答和题目来源(没找到别的题目来源) 题目大意: 城市交通费 [问题描述 ...

  10. Tesseract-ocr 安装配置

    参考:https://jingyan.baidu.com/article/219f4bf788addfde442d38fe.html 1.下载图形识别工具Tesseract-ocr,下载路径https ...