68

每个Java 工程师心中都有一个 JVM的梦

 6 years ago
source link: http://www.10tiao.com/html/142/201807/2650859798/1.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client


就像我们称呼有多年驾驶经验的人为「老司机」,除了指其驾驶技术好之外,一定也是这些老司机们,对于车的整体了解要很深入。比如什么时候要看看胎压,什么时候检查检查机油。车行半道抛了锚,老司机能换得了轮胎,拆得了发动机,使得惯千斤顶,认得出服务区……
(此处推荐一本神书『禅与摩托车维修的艺术』)

每个 Java 工程师,也许心中都曾有过「剖析」JVM 的梦想。就像庖丁解牛一般,通过对JVM的深入理解,达到对自己所写的 Java 程序了如指掌。对JVM的深入理解,就像老司机对于车况的理解一样,能更有助于你车行千里。


你有没有这样的困惑,为什么我们只写了个「Hello World」,后台却启动了一大堆的线程?

每次说起或者读到 Java 的垃圾收集,都会提到 Stop-The-World,safe-point, 会执行到就近的安全点,然后开始进行垃圾收集。

那怎么理解安全点? 在垃圾收集的时候,只能通过GC Log 来了解曾经执行的蛛丝马迹,或者 Dump 出来堆来使用 MAT 之类的工具来离线分析。
而JVM的理解,也许能有助我们在 coding阶段就可以大致预测 GC 可能的情形。

你有没有这样的好奇,我们常用的Oracle JDK 所使用的 JVM,又称为 「HotSpot」 JVM, 为什么这样称呼它? 有哪些东西在情形下会成为 HotSpot呢?

一直以来,在工程师心中都明白 Java的执行要比 C++ 之类的慢很多,但运行一段时间,「热身」过后, Java 的应用的速度就会提速很多,赶上来,差异不再那么明显,这又是为什么?

在 Java 应用中,可以通过 synchronized 使用 Monitor Lock,来进行并发的控制。那其背后的 jvm 指令 monitorentry 和 monitorexit 又是怎样保证线程之间的这种happends-before关系的呢?对应的 JMM 在 虚拟机层面又是怎么实现的?

我们常会用到 JProfileBTrace 等trace 工具进行代码的分析与优化,这些工具是怎样和 JVM 进行联系通讯的? Trace 工具又怎样在运行时神奇的 织入了增强的代码到已有的 class 中?

虽然不一定每个人都去开发JVM,但通过对 JVM 的了解学习,能让我们更好的理解Java,做一个更优秀的Java 工程师,对于代码的执行做到心中有数。

在了解到 VM 的Agent 与 attach机制,以及以此实现的各类工具的执行原理,当自己项目中有相关需求时可以更好的应用整合。

我之前在开发监控工具时,为了通过JMX的形式attach到各个指定的 java 进程中,获取对应的信息。其中有些并没有提供对应的 JMXURL,没法直接通过JMX 连接的形式attach,当时各种没思路,翻看OpenJDK的源码里提供的 JConsole 源码,其中包含一部分类似的内容,其中会用到 Oralce JVM 的 「VirtualMachine」这一部分,顺着这个实现看了点,问题迎刃而解。

再比如我们常会说 synchronized 这个显示锁可以保证线程安全, volatile 则不能。javap 看出在 jvm指令上即有区别,再参照 Java内存模型(JMM)的实现,会更好的理解这些内容。

而且近几年,不少新的「语言」或淡妆浓抹,或淡雅清新,纷纷登上 JVM 这个舞台,焕发出别样的魅力,了解 JVM,也可以更好的理解这些新语言。

关于 JVM,我也是个门外汉,一直有些兴趣,之前推荐过一本自己动手写简易JVM的内容:学习Java虚拟机也许这是最好的方法  昨天看到这个JVM的专栏,果断加入了。

要不要一起来,「深入 JVM, 为Java 的 coding 加点料」。


专栏作者及目录信息如下,供参考了解:

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

整个专栏将分为四大模块。

基本原理:剖析Java虚拟机的运行机制,逐一介绍Java虚拟机的设计决策以及工程实现;
高效实现:探索Java编译器,以及内嵌于Java虚拟机中的即时编译器,帮助你更好地理解Java语言特性,继而写出简洁高效的代码;
代码优化:介绍如何利用工具定位并解决代码中的问题,以及在已有工具不适用的情况下,如何打造专属轮子;
虚拟机黑科技:介绍甲骨文实验室近年来的前沿工作之一GraalVM。包括如何在JVM上高效运行其他语言;如何混搭这些语言,实现Polyglot;如何将这些语言事前编译(Ahead-Of-Time,AOT)成机器指令,单独运行甚至嵌入至数据库中运行。



相关阅读:

怎样阅读源代码?

读源码时,我们到底在读什么?

Java七武器系列长生剑 -- Java虚拟机的显微镜 Serviceability Agent


关注『 Tomcat那些事儿  』 ,发现更多精彩文章!了解各种常见问题背后的原理与答案。深入源码,分析细节,内容原创,欢迎关注。

                       转发是最大的支持,谢谢


更多精彩内容:

一台机器上安装多个Tomcat 的原理(回复001)

监控Tomcat中的各种数据 (回复002)

启动Tomcat的安全机制(回复003)

乱码问题的原理及解决方式(回复007)

Tomcat 日志工作原理及配置(回复011)

web.xml 解析实现(回复 012)

线程池的原理( 回复 014)

Tomcat 的集群搭建原理与实现 (回复 015)

类加载器的原理 (回复 016)

类找不到等问题 (回复 017)

代码的热替换实现(回复 018)

Tomcat 进程自动退出问题 (回复 019)

为什么总是返回404? (回复 020)

...

PS: 对于一些 Tomcat常见问,在公众号的【常见问题】菜单中,有需要的朋友欢迎关注查看。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK