小说连载系列是我第一次尝试的新的技术讲解方式,希望通过小说的形式将技术细节讲解清楚。
第一篇中长篇连载小说《我在JVM公司的那些年》,主要讲解JVM内部的一些原理,希望大家能够喜欢,多多支持。
郑重声明:小说人物和故事情节均是原创,未经同意禁止任何形式的转载,侵权将进入法律程序。大佬除外。
欢迎大家转发文章,谢谢!
本节知识点预告:虚拟机栈简介。
大家好,我叫小史,是一个非科班程序员……哦,不,在这部小说中,我是一个java对象。
前情回顾:
前几天就预订了
虚拟机栈员工的分享,今天终于等到了。
提问
下午
3点一到,一位小哥哥就走上了讲台:“大家好,我是蛋哥,是虚拟机栈部门的员工。”
其实通过上次的分享,我已经知道咱们
JVM公司分为
堆内存区和
方法区,于是我直接提了一个问题:“请问,虚拟机栈是在堆内存还是在方法区呢?”
蛋哥:“哈哈,都不是,你刚刚说的那两个区域呀,都是
线程共享的,而
虚拟机栈是线程私有的。”
我:“怎么理解?”
蛋哥:“假如有两个线程,公司会分配两个虚拟机栈,每个线程一个。”
多线程的问题我之前还真没考虑过,看来我还是太嫩了。
我:“所以虚拟机栈所在的区域又是自己单独的一块空间啦?”
蛋哥:“没错。”
原来如此,我迅速脑补了一下公司的区域分布图。
分享
回答完我的问题,蛋哥继续他的分享:“其实虚拟机栈没有大家想得那么神秘,
它就
是一个栈。”
蛋哥:“只不过栈里面的元素有一个特殊的名字,叫做
栈帧。”
蛋哥:“
栈帧其实就
对应一个方法调用,
每次调用一个方法的时候,就会有一个栈帧压入虚拟机栈,而一个方法调用完毕要返回的时候,就会有一个栈帧出栈。”
我听得津津有味,不自觉又问了一个问题:“那栈帧里面都有啥呢?”
蛋哥:“栈帧里面呀,主要是
局部变量表和
操作数栈。”
我:“等等,局部变量表?我记得好像哪里听说过,是不是它也
是GCRoot的一部分?”
蛋哥:“你说对了,每次垃圾回收器要进行垃圾回收的时候,都会到虚拟机栈来看看局部变量所引用的对象,这些对象不会被回收。”
实操
蛋哥:“这样讲可能大家不是很理解,这样吧,我这有一张山河社稷图,图里是一个虚拟世界,可以随便运行代码并断点调试,大家随我到图里来看看吧。”
山河社稷图?这可是天上才有的宝贝啊。
我:“你从哪弄来这图的?”
蛋哥:“上次去看了一部叫《哪吒》的电影,座位下就有这图,顺便拿来了。”
我们嗖地一声都进到了图纸里。
(未完待续……)
山河社稷图里面到底又有什么样的乾坤,虚拟机栈到底是如何工作的,欲知后事如何,请听下回分解。
小结
在JVM虚拟机中,堆内存和方法区是线程共享的,虚拟机栈是线程私有的,每个线程会有一个虚拟机栈。
虚拟机栈就是一个普通栈,里面的元素是栈帧。
每一次方法调用,对应一个栈帧入栈,方法返回,对应栈帧出栈。
栈帧里面主要存储局部变量表和操作数栈。
局部变量表可是作为GCRoot的哟。
下节知识点预告:代码实操
第一次尝试写技术小说,如果你喜欢这种形式,麻烦动动手指转发一下,你不经意间的动作,可能就会给大家带来一部伟大的技术小说。