我在JVM公司的那些年(十二)——蛋哥的分享

我在JVM公司的那些年(十二)——蛋哥的分享

小说连载系列是我第一次尝试的新的技术讲解方式,希望通过小说的形式将技术细节讲解清楚。

第一篇中长篇连载小说《我在JVM公司的那些年》,主要讲解JVM内部的一些原理,希望大家能够喜欢,多多支持。

郑重声明:小说人物和故事情节均是原创,未经同意禁止任何形式的转载,侵权将进入法律程序。大佬除外。

欢迎大家转发文章,谢谢!


本节知识点预告:虚拟机栈简介。

大家好,我叫小史,是一个非科班程序员……哦,不,在这部小说中,我是一个java对象。

前情回顾:

前几天就预订了虚拟机栈员工的分享,今天终于等到了。

提问

下午3点一到,一位小哥哥就走上了讲台:“大家好,我是蛋哥,是虚拟机栈部门的员工。”

其实通过上次的分享,我已经知道咱们JVM公司分为堆内存区方法区,于是我直接提了一个问题:“请问,虚拟机栈是在堆内存还是在方法区呢?”

蛋哥:“哈哈,都不是,你刚刚说的那两个区域呀,都是线程共享的,而虚拟机栈是线程私有的。”

我:“怎么理解?”

蛋哥:“假如有两个线程,公司会分配两个虚拟机栈,每个线程一个。”

多线程的问题我之前还真没考虑过,看来我还是太嫩了。

我:“所以虚拟机栈所在的区域又是自己单独的一块空间啦?”

蛋哥:“没错。”

原来如此,我迅速脑补了一下公司的区域分布图。

我在JVM公司的那些年(十二)——蛋哥的分享

分享

回答完我的问题,蛋哥继续他的分享:“其实虚拟机栈没有大家想得那么神秘,它就是一个栈。”

蛋哥:“只不过栈里面的元素有一个特殊的名字,叫做栈帧。”

蛋哥:“栈帧其实就对应一个方法调用每次调用一个方法的时候,就会有一个栈帧压入虚拟机栈,而一个方法调用完毕要返回的时候,就会有一个栈帧出栈。”

我听得津津有味,不自觉又问了一个问题:“那栈帧里面都有啥呢?”

蛋哥:“栈帧里面呀,主要是局部变量表操作数栈。”

我:“等等,局部变量表?我记得好像哪里听说过,是不是它也是GCRoot的一部分?”

蛋哥:“你说对了,每次垃圾回收器要进行垃圾回收的时候,都会到虚拟机栈来看看局部变量所引用的对象,这些对象不会被回收。”

实操

蛋哥:“这样讲可能大家不是很理解,这样吧,我这有一张山河*图,图里是一个虚拟世界,可以随便运行代码并断点调试,大家随我到图里来看看吧。”

山河*图?这可是天上才有的宝贝啊。

我:“你从哪弄来这图的?”

蛋哥:“上次去看了一部叫《哪吒》的电影,座位下就有这图,顺便拿来了。”

我们嗖地一声都进到了图纸里。

(未完待续……)



山河*图里面到底又有什么样的乾坤,虚拟机栈到底是如何工作的,欲知后事如何,请听下回分解。

小结

在JVM虚拟机中,堆内存和方法区是线程共享的,虚拟机栈是线程私有的,每个线程会有一个虚拟机栈。虚拟机栈就是一个普通栈,里面的元素是栈帧。每一次方法调用,对应一个栈帧入栈,方法返回,对应栈帧出栈。栈帧里面主要存储局部变量表和操作数栈。局部变量表可是作为GCRoot的哟。

下节知识点预告:代码实操


第一次尝试写技术小说,如果你喜欢这种形式,麻烦动动手指转发一下,你不经意间的动作,可能就会给大家带来一部伟大的技术小说。

我在JVM公司的那些年(十二)——蛋哥的分享