博学之,审问之,慎思之,明辨之,笃行之!

导航

2021年9月16日 #

深入拆解JVM虚拟机

摘要: 深入拆解JVM虚拟机 开篇词 "00 为什么我们要学习 JVM 虚拟机?" 模块一:Java 虚拟机基本原理 "01 Java代码是怎么运行的?" "02 Java 的基本类型" "03 Java虚拟机是如何加载Java类的?" "04 JVM 是如何执行方法调用的?(上)" "05 JVM 是如何 阅读全文

posted @ 2021-09-16 21:04 PP杰 阅读(126) 评论(0) 推荐(0) 编辑

12 - 垃圾回收(下)

摘要: 我曾经写过一个统计 Java 对象生命周期的动态分析,并且用它来跑了一些基准测试。 其中一些程序的结果,恰好验证了许多研究人员的假设,即大部分的 Java 对象只存活一小段时间,而存活下来的小部分 Java 对象则会存活很长一段时间。 (pmd 中 Java 对象生命周期的直方图,红色的表示被逃逸分 阅读全文

posted @ 2021-09-16 20:22 PP杰 阅读(48) 评论(0) 推荐(0) 编辑

11 - 垃圾回收(上)

摘要: 你应该听说过这么一句话:免费的其实是最贵的。 Java 虚拟机的自动内存管理,将原本需要由开发人员手动回收的内存,交给垃圾回收器来自动回收。不过既然是自动机制,肯定没法做到像手动回收那般精准高效[^1] ,而且还会带来不少与垃圾回收实现相关的问题。 接下来的两篇,我们会深入探索 Java 虚拟机中的 阅读全文

posted @ 2021-09-16 20:10 PP杰 阅读(66) 评论(0) 推荐(0) 编辑

10 - Java 对象的内存布局

摘要: 在 Java 程序中,我们拥有多种新建对象的方式。除了最为常见的 new 语句之外,我们还可以通过反射机制、Object.clone 方法、反序列化以及 Unsafe.allocateInstance 方法来新建对象。 其中,Object.clone 方法和反序列化通过直接复制已有的数据,来初始化新 阅读全文

posted @ 2021-09-16 19:57 PP杰 阅读(98) 评论(0) 推荐(0) 编辑

09 - JVM 是怎么实现 invokedynamic 的?(下)

摘要: 上回讲到,为了让所有的动物都能参加赛马,Java 7 引入了 invokedynamic 机制,允许调用任意类的“赛跑”方法。不过,我们并没有讲解 invokedynamic,而是深入地探讨了它所依赖的方法句柄。 今天,我便来正式地介绍 invokedynamic 指令,讲讲它是如何生成调用点,并且 阅读全文

posted @ 2021-09-16 19:50 PP杰 阅读(74) 评论(0) 推荐(0) 编辑

08 - JVM 是怎么实现 invokedynamic 的?(上)

摘要: 前不久,“虚拟机”赛马俱乐部来了个年轻人,标榜自己是动态语言,是先进分子。 这一天,先进分子牵着一头鹿进来,说要参加赛马。咱部里的老学究 Java 就不同意了呀,鹿又不是马,哪能参加赛马。 当然了,这种墨守成规的调用方式,自然是先进分子所不齿的。现在年轻人里流行的是鸭子类型(duck typing) 阅读全文

posted @ 2021-09-16 17:45 PP杰 阅读(61) 评论(0) 推荐(0) 编辑

07 - JVM是如何实现反射的?

摘要: 今天我们来聊聊 Java 里的反射机制。 反射是 Java 语言中一个相当重要的特性,它允许正在运行的 Java 程序观测,甚至是修改程序的动态行为。 举例来说,我们可以通过 Class 对象枚举该类中的所有方法,我们还可以通过 Method.setAccessible(位于 java.lang.r 阅读全文

posted @ 2021-09-16 15:15 PP杰 阅读(52) 评论(0) 推荐(0) 编辑

06 - JVM是如何处理异常的?

摘要: 今天我们来讲讲 Java 虚拟机的异常处理。 众所周知,异常处理的两大组成要素是抛出异常和捕获异常。这两大要素共同实现程序控制流的非正常转移。 抛出异常可分为显式和隐式两种。显式抛异常的主体是应用程序,它指的是在程序中使用“throw”关键字,手动将异常实例抛出。 隐式抛异常的主体则是 Java 虚 阅读全文

posted @ 2021-09-16 13:58 PP杰 阅读(106) 评论(0) 推荐(0) 编辑

05 - JVM 是如何执行方法调用的?(下)

摘要: 我在上学的时候,最怕的事情就是被问有没有新的 Idea。有一次我被老板问急了,就随口说了一个。 这个 Idea 究竟是什么呢,我们知道,设计模式大量使用了虚方法来实现多态。但是虚方法的性能效率并不高,所以我就说,是否能够在此基础上写篇文章,评估每一种设计模式因为虚方法调用而造成的性能开销,并且在文章 阅读全文

posted @ 2021-09-16 13:42 PP杰 阅读(61) 评论(0) 推荐(0) 编辑

04 - JVM 是如何执行方法调用的?(上)

摘要: 前不久在写代码的时候,我不小心踩到一个可变长参数的坑。你或许已经猜到了,它正是可变长参数方法的重载造成的。(注:官方文档建议避免重载可变长参数方法,见[^1]的最后一段)。 我把踩坑的过程放在了文稿里,你可以点击查看。 当时情况是这样子的,某个 API 定义了两个同名的重载方法。其中,第一个接收一个 阅读全文

posted @ 2021-09-16 13:32 PP杰 阅读(55) 评论(0) 推荐(0) 编辑

03 - Java虚拟机是如何加载Java类的?

摘要: 听说意大利那边有个习俗,就是父亲要帮儿子盖栋房子。 这事要放在以前还挺简单,亲朋好友搭把手,盖个小砖房就可以住人了。现在呢,整个过程要耗费好久的时间。首先你要请建筑师出个方案,然后去市政部门报备、验证,通过后才可以开始盖房子。盖好房子还要装修,之后才能住人。 盖房子这个事,和 Java 虚拟机中的类 阅读全文

posted @ 2021-09-16 13:00 PP杰 阅读(55) 评论(0) 推荐(0) 编辑

02 - Java 的基本类型

摘要: 如果你了解面向对象语言的发展史,那你可能听说过 Smalltalk 这门语言。它的影响力之大,以至于之后诞生的面向对象语言,或多或少都借鉴了它的设计和实现。 在 Smalltalk 中,所有的值都是对象。因此,许多人认为它是一门纯粹的面向对象语言。 Java 则不同,它引进了八个基本类型,来支持数值 阅读全文

posted @ 2021-09-16 11:45 PP杰 阅读(63) 评论(0) 推荐(0) 编辑

01 - Java代码是怎么运行的?

摘要: 我们学院的一位教授之前去美国开会,入境的时候海关官员就问他:既然你会计算机,那你说说你用的都是什么语言吧? 教授随口就答了个 Java。海关一看是懂行的,也就放行了,边敲章还边说他们上学那会学的是 C+。我还特意去查了下,真有叫 C+ 的语言,但是这里海关官员应该指的是 C++。 事后教授告诉我们, 阅读全文

posted @ 2021-09-16 10:59 PP杰 阅读(182) 评论(0) 推荐(0) 编辑

00 - 为什么我们要学习 JVM 虚拟机?

摘要: 前不久我参加了一个国外程序员的讲座,讲座的副标题很有趣,叫做:“我如何学会停止恐惧,并且爱上 Java 虚拟机”。 这句话来自一部黑色幽默电影《奇爱博士》,电影描述了冷战时期剑拔弩张的氛围。 程序员之间的语言之争又未尝不是如此。写系统语言的鄙视托管语言低下的执行效率;写托管语言的则取笑系统语言需要手 阅读全文

posted @ 2021-09-16 10:34 PP杰 阅读(109) 评论(0) 推荐(0) 编辑