有相关统计数据显示,Java开发者有1000万+,这么多的人每天都在使用Java虚拟机进行开发,不过真正看过虚拟机代码的人应该非常非常少吧,可能有些人研究过,不过由于Java虚拟机是一个高度复杂的系统性工程,过于复杂的实现让他们最终放弃。

目前服务器上使用最多的虚拟机还是HotSpot,HotSpot是用C/C++编写的,JDK8版本中虚拟机的代码就有60万行左右的代码,我们需要聚焦C1、C2编译器、垃圾回收、最基础的类加载等模块,以及只针对某一特定平台和架构下的代码实现(推荐研究linux平台下的x86-64位架构实现),那也有50万行左右的代码,所以对于想研究HotSpot虚拟机的Java程序员来说,挑战很大。

这一篇就以HotSpot中实现相对复杂的一个点展开研究,看看它是如何一步一步变成今天这么复杂的。简单来说,有为了性能的,也有为了满足Java更多特性的,以GC任务提交执行为例能很好的说明代码从简单变为复杂的一个过程。

文章分为4部分:

基本需求
执行非安全点任务
优化安全点任务的执行效率
支持临界区
4.1 VMThread对临界区的支持
4.2 业务线程对临界区的支持
4.3 业务线程提交GC任务
通过学习这篇文章,你就能够从最简单的实现开始,一步一步彻底理解ParallelScavengeHeap::mem_allocate()、VMThread::execute()以及VMThread::loop()这些复杂函数的实现逻辑了。

业务线程在执行应用程序时,通过调用ParallelScavengeHeap::mem_allocate()函数为Java对象分配内存。如果内存不足,此时就要调用VMThread::execute()函数向队列提交一个GC任务了。
VMThread::loop()中有一个VMThead守护线程会从队列中取出这些任务(包括刚才提交的GC任务)并执行垃圾收集。


安静磊哥
1 声望0 粉丝

学习