从零开始看源码,旨在从源码验证书上的结论,探索书上未知的细节。有疑问欢迎留言探讨
个人源码地址:https://github.com/FlashLightNing/openjdk-notes
还有一个openjdk6,7,8,9的地址:https://github.com/dmlloyd/openjdk
jvm源码阅读笔记[1]:如何触发一次CMS回收
jvm源码阅读笔记[2]:你不知道的晋升阈值TenuringThreshold详解
jvm源码阅读笔记[3]:从内存分配到触发GC的细节
jvm源码阅读笔记[4]:从GC说到vm operation
jvm源码阅读笔记[5]:内存分配失败触发的GC究竟对内存做了什么?
上一篇文章中,我们说到如果在堆中分配失败,会通过VM触发一次由分配失败触发的一次GC。
VM_GenCollectForAllocation op(size, is_tlab, gc_count_before);//VM操作
VMThread::execute(&op);
在讲VM_GenCollectForAllocation这个vm operation具体都做了什么前,先来看看VMThread是个什么东西。
VMThread可以用以下命令查到。
jstack pid|grep VM
在虚拟机创建时就会创建一个单例原生线程VMThread。这个线程能派生出其他线程。同时,这个线程的主要的作用是维护一个vm操作队列(VMOperationQueue),用于处理其他线程提交的vm operation,比如执行GC等。
来看看VMOperationQueue:
class VMOperationQueue :