從喫雞的角度看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虛擬機》。謝謝

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