从吃鸡的角度看java内存区域-天马行空

前言

自我介绍一下哈,有点技术宅,还喜欢玩和平精英。突然有一天灵光一闪,觉得Java的内存区域跟吃鸡场景有点相似。为了方便理解记忆,记录一下,不详尽之处还请批评指教。(也是因为最近在看深入理解java虚拟机有感)

谈起吃鸡,想必熟悉的朋友并不陌生。刚开局,我们就在一个公共区域玩耍,然后跳伞,在一个更大的区域,进行激烈的角逐。我们每个人都会有主要的枪栈(可以有两把突突枪和一把手枪)和一个装着各种药的栈。当然还有控制这个角色的你。这很重要哟。emmm~,还有毒圈。

就上面提到的几个概念进行分析一下,其他未提到的三级包啊,手雷啊等还请忽略一下下。
想象一下,我自己是一个线程。也是一个吃鸡的选手。接下来就开始一场吃鸡之旅!

程序计数器

我作为一个吃鸡选手,所有的操作都是我自己决定的,当我正在玩吃鸡,喝着肥宅快乐水。突然女朋友发来一条消息,我能不回一下嘛?肯定不行呀,于是我切出去,回复可爱的小仙女。回复完成后,我开始接着回去玩游戏,这时候,吃鸡进展到什么时候了,我在哪里,手里有什么装备,我都是记得的。同样的作为一个线程,我肯定是要私有一个程序计数器的。能够在我被打断的情况下,还能记得我在什么位置。这个真的很棒。我自己的脑子是我自己的,那么程序计数器也是线程私有的啦!

如果有意外发生呢?突然我女朋友看我玩的太久了,不同意我继续玩啦。我只能退出,对之后的比赛,一无所知。就像我作为线程,执行了一个Native方法(非Java语言写的代码),我也是一头懵逼,就变成了Undefined。所以程序计数器这里不会有任何OutOfMemoryError的情况。也是所有Java内存区域唯一一个不会溢出的区域。

java虚拟机栈

我作为一个星钻水平的吃鸡种子选手。有一把非常顺手的M416,用来钢枪。这把枪当然是我私有的,什么地位呢?人在M416在,人不在,M416不是我的了。这个枪呢?有四个配件,枪口(子弹出口),握把弹夹(存子弹),枪托(链接身体,更稳)。这里主要说一下弹夹,这个弹夹呢,这里的弹夹比较神奇,可以装7.62子弹和5.56子弹。什么区别,当然是7.62子弹比较重啦。

呐,我又作为一个线程。我的java虚拟机栈当然跟程序计数器一样,也是私有的。并且生命周期也是跟我这个线程一样的。而我每执行一个方法都会创建一个栈帧(类似吃鸡的装枪的栈),每个栈帧里面会安排方法出口操作数栈局部变量表动态链接。局部变量表用来存各种基本数据类型,对象引用和returnAddress。其中long和double(64位)比较大。占掉两个局部变量空间(Slot)。其余的都是占一个局部变量空间。当执行一个确定的方法时,局部变量表的空间完全是确定的。在执行期间不会改变局部变量表的大小。

本地方法栈

我作为一个星钻水平的吃鸡种子选手。钢枪是必须的,但难免会受伤。但是我不担心,因为我有一个专门的本地方法栈。存放各种补给,药包,饮料,止痛药等等。

在本地方法栈中,本地方法栈与虚拟机栈发挥的作用呢,也是非常相似的。区别就是本地方法栈为虚拟机使用到的Native方法服务。就真么简单。
image

java堆

我作为一个星钻水平的吃鸡种子选手。会和100个吃鸡选手一起跳到,游戏开始区域和游戏进行区域。就像刚开始说的刚开局,我们就在一个公共区域玩耍,然后跳伞,在一个更大的区域,进行激烈的角逐。这些公共区域是大家公有的。它唯一的作用就是存我的实体(我比较厉害,单排打四个)。还有那些一组一组的吃鸡选手的实体。
在游戏期间,有毒圈,不同时期的毒性还不一样。用来淘汰选手,当然我是吃鸡的,活的最久的哪一个。

哎,我又变成了一个线程,我会和很多其他线程被安排到堆内存里去执行实例对象和数组。java堆是垃圾收集器管理的主要区域,从垃圾回收的角度,可以把java堆细分成新生代和老年代。

方法区

我作为一个星钻水平的吃鸡种子选手。我只知道我和其他选手一样,一开始就在一个公共区域玩耍。却不知道这里有我还有其他选手的所有信息,比如名字,等级,衣服种类,性别等等一系列数据。

转换角度,方法区与java堆内存一样,是线程共享的内存区域,它就是用来存储已经被虚拟机加载的类信息、常量、静态变量等数据。

image

总结

此次分享到此告一段落,旨在帮助自己理解记忆Java内存区域,帮助我自己入门java虚拟机。如果想要了解更多,推荐系统学习JVM。推荐书籍《深入理解java虚拟机》。谢谢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章