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