我是一個Java class

      網友投稿 665 2025-04-08

      前言:本文主要想講一下Java虛擬機的故事, 可能有點偏門,不妥之處歡迎留言交流。


      第一回 陌生警察

      我出生在C盤下面一個很深層次的目錄下, 也不知道是誰把我放到這里的。

      我一直在睡覺,外邊的日出日落,風雨雷電和我一點關系都沒有。

      直到有一天,有個家伙咣咣咣砸我房門把我叫醒。

      這個家伙穿著像警察的制服, 左手拿著一個對講機, 右手遞過來他的工作證:?"你好, 我是Classloader, ?請問你是Account類嗎"

      "是啊, 怎么了?"

      這個Classloader 沒回答我, 反而拿起對講機:

      "頭兒,你看看你能不能裝載這個Account類?”

      對講機那頭好像也在問他的上司,過了半天,終于有了回音:

      "我裝載不了, 我的上級也說了,他們也裝載不了, 你來干吧"

      "那就報數吧~” 我這次注意到旁邊站著另外一個笑瞇瞇的小個子。

      "報什么數?" 我一臉詫異。

      "唉,果然沒有被裝載過, 你是個class 文件,當然要報文件開頭的那幾個數了, 就是Java 他爸James?Gosling 在jdk 1.0時確定的那個數啊"

      "奧, 我看看,?0xCAFEBABE"

      "不錯, 是個java 類, 把你后邊的兩個數也報一下", 小個子繼續問

      "50 , 0"

      "看來版本不高啊, 是jdk 1.6編譯出來的啊", ?小個子接著說?"最新的虛擬機都1.8了, ?都函數式了,你造不?”

      我哪里知道? 我這才模模糊糊的回想起來, 好像是有個什么javac 把我創建出來,扔到了這個屋子里。

      "現在奉命帶你去Java 虛擬機, 有人需要你的幫助" , 這個Classloader 態度冷冰冰的, 我不喜歡他。

      "大哥,你們咋找到我的?" ?我決定和小個子套近乎。

      "那還不簡單, 我們老板有個列表, 上面列舉著所有應該檢查的目錄,我們順藤摸瓜,一個一個找,肯定能找到"

      "那萬一找不到咋辦?"

      "基本不可能, 你看老板給我們的目錄列表中有?C:\workspace\myTaobao\bin ?, 我們在下面再找三級 com/mytaobao/domain, 這不就找到你了嗎,

      Account.class , 話說回來, 萬一真找不到, 將來在執行時會拋出ClassNotFound異常了, 那不歸我們管"

      我后來才知道, 我的全名其實叫做com.mytaobao.domain.Account !

      "來來來, 讓我驗證一下, 你這class編譯的對不對" ,小個子拿出一個放大鏡

      "恩, 常量池, ?訪問標識, 字段,方法... 看起來沒有問題“ , 小個子對Classloader說。

      被人拿著放大鏡看,這種感覺極為不爽。

      "走, 去虛擬機" ?, Classloader還是冷冰冰的。

      這哥倆不容我帶任何東西, 便把我推上車,飛奔向我沒聽說過的“虛擬機”。

      第二回 刺探信息

      我感到前途未卜, 但也不能坐以待斃, 一定得多了解信息。

      "大哥, 你叫什么名字" , 我看小個子還算和氣。

      "我就是大名鼎鼎的文件驗證器了, 能管很多事"

      "那剛才他為啥還得請示上級呢" , 我用眼神指了一下開車的ClassLoader

      文件驗證器的聲音一下子就壓低了:

      "你不知道,說來話長, 我們之前出現過事故,有個黑客寫了個類java.lang.String, ?和我們老板手下有一個干活最賣力的員工名字一模一樣,只是這個黑客類里邊竟然有格式化硬盤的代碼,我們的小兵Classloader 不明就里,就把這個黑客類給先裝載了,也執行了, 最后的結果,唉,很慘的... "

      "那后來怎么辦?"

      "后來我們老板就定下了規矩:他的骨干員工像String, ArrayList等只能由他自己的心腹去裝載, 我聽說老板的心腹都是分層級的,像傳銷一樣, 每個都有上線, 最頂層的叫Bootstrap?Classloader?, 下一次級叫Extension?Classloader, 現在開車的這位其實叫App Classloader,位于最底層, ?咱這位Classloader 在裝載一個類之前,一定要問一問這幾位權利極高的大爺,請他們先裝載,這幾位爺裝載不了,才由我們這些小兵來出馬。“

      "這能避免黑客攻擊?"

      "能?。?你想想, 那個黑客寫了個攻擊的java.lang.String, ?我們在裝載之前,肯定要請示Extension, Bootstrap這些大爺先來裝載, 由于String是老板的核心員工,肯定會他們先裝載啊, 這些大爺把String 直接就給我們了, 我們就不會裝載黑客類了"

      “你能不能少說兩句” Classloader 似乎生氣了。

      我和文件驗證器只好禁聲。

      其實文件驗證器也不是只會給我吹牛, 他也很敬業, 這家伙在車上把我全部的字節碼都要了過去, 對這些天書一般的東西一遍一遍的檢查分析,確保每個指令都是正確的, 檢查是不是有超類, 是不是覆蓋了final方法,跳轉指令是不是正確....

      第三回 初識虛擬機

      很快我們就來到了目的地, 我一看虛擬機不就是幾個大樓嘛, 不過這幾座大樓可真是高啊。

      他倆把我帶進其中一座叫“方法區”的大樓,進了電梯, 輸入2048 。

      很快來到第2048層, 無數的格子間平鋪開來,他們七拐八拐,輕松的把我帶到了我的位置, 上面寫著我的名字“com.mytaobao.domain.Account”.

      我問文件驗證器: “這樓這么高, 這么多格子間, 人會坐滿嗎?”

      "只有極少情況會坐滿, 一旦滿了,那時候會拋出異常,?我們就完蛋了。 你自己好自為之吧, 再見 "

      他們把我安頓好就立刻離開了。

      我往周邊一看, 咦,這不是著名的java.lang.String嗎。

      我本想和他打個招呼, 可以他的電話似乎一直沒斷過, 嘴里一直說著什么store, load之類我聽不懂但是似乎有點熟悉的話。

      正無聊著呢,我桌子上的電話也響了, 電腦屏幕也亮了,我看到一個人對我笑著說:

      "你好, 我剛剛new 出來的Account對象, 我的編號是Account@659e0bfd"

      暈倒 ! 這家伙和我什么關系?

      看我一臉的詫異, 他說,“ 很快就會有個線程到CPU車間了,他會聯系你, 我就是想確認下你在不在, ?奧對了, 我在一個叫做堆的地方, 有空找我玩啊, byebye ”, 說完就消失了。

      果然沒多久, 視頻電話又響了。

      這次我看到一個人站在一個明亮的車間里, 抱著一個包裹, 他按了一個按鈕, 面前立刻升起一個工作臺 , 臺子上立了一個有很多抽屜的柜子,每個抽屜上都有一個編號, 旁邊還有一個深桶。

      (后來我就知道, 那個柜子的學名叫做局部變量區 ,?那個桶叫做?操作數棧)

      我正想問問問怎么回事呢, 就聽到了他的聲音:

      "我是線程0x3704, ?我要調用你第二個方法了“

      (碼農翻身注: 不認識線程0x3704的同學可以回復“我是一個線程”查看)

      我一看, 我的第二個方法是add :

      public void add(int x , int y ){

      x = x + y;

      .....其他代碼略....

      }

      (碼農翻身注: Account類當然看不到這些源碼, 這是為了方便你看的 ?:-) )

      "請把第一條指令給我說一下" ? ?0x3704 繼續問我要東西

      我還不太熟練,找了半天才說:

      "iload_0"

      于是他就操作柜子上的機械手把0號抽屜的一個數30扔到到了工作臺上的一個桶里,這個桶很窄,沒法并排放兩個數, 但是很深。

      然后0x3704說 “下一條指令”

      "iload_1"

      于是1號抽屜的一個數40也被扔到了桶里,正好壓在30上面, 從桶上面就看不到30了。

      “下一條指令”

      ”iadd“

      于是他就把兩個數從桶里取了出來, 做了個飛快的動作, 這兩個數變成了一個數 70 !, 然后他又把70 放到了桶里。

      “下一條指令”

      "istore_0"

      于是他把70從桶里撈出來, 放到了柜子上編號為0的地方, 之前的30就被扔掉了。

      我看的目瞪口呆,這廝是在干嘛???

      我問他: “0x3704, 不就是把兩個數加起來嗎? 為啥搞的這么麻煩”

      他不理我, 只是繼續說, “下一條指令”

      我只有配合它玩這個游戲。

      java.lang.String 難得的悠閑, 端著一杯咖啡一邊看我手忙腳亂的取指令, 一邊說:

      "新人都這樣, 別著急,等你熟練了,閉著眼睛就搞定了, 就像我一樣,你可能不知道 , 我們這個虛擬機叫做基于堆棧的虛擬機, 看到那個桶沒有,其實就是個先進后出的棧啊, 我們虛擬機的所有指令其實都是在對棧進行操作"

      可是我還是好奇: “這棧有什么好啊”

      旁邊的格子間的java.util.Stack 立刻說:

      "這事兒你得問我啊,?怎么說呢, 主要是為了簡單, 你看我們只用一個簡單的桶,奧對了,棧, 就能完成所有的工作, 你做要的就是往棧里扔東西(入棧), 然后從最上面拿東西(出棧) 就行了。?不像intel 的CPU, 搞了巨多的桶,每個桶只能容納一個數, 他們還美名其曰寄存器, 做加法的時候, 先把一個數放到第一個桶, 再把另外一個數放到第二個桶,加起來以后的結果還得找個桶,有些桶還不通用,這么多桶找起來麻煩死了。 "

      "可是我們的棧操作起來就麻煩了啊, 你看一個簡單的加法都得操作半天" ?,我不依不饒。

      "我們的指令可以優化啊, 不過這我也不太懂"

      這個游戲我整整完了一天,沒有線程找我的時候, 我就閑著, String說得對, 熟練以后簡直太簡單了。

      String 就不一樣了, 幾乎每時每刻都線程給他打電話要指令, 這么沒辦法, String確實是虛擬機的骨干和精英, 使用頻繁,業務純熟,忙而不亂。

      有時候我會看到線程有不止一個工作臺, 而是一摞子工作臺, 也是一個壓一個, 線程們都很老實,永遠在最上面那個工作, 從來不會先干下面的活。

      我問java.util.Stack :"這些工作臺也是棧吧"

      "猜的不錯,學名叫Java 棧,每個線程都有一個, ?其中的每個工作臺你看過了 ,學名叫棧幀, 知道不???每個臺子都代表一個方法調用, 這一摞工作臺就方法調用方法導致的啊?"

      確實是, 因為我發現一旦調用新方法, 立刻就會形成一個新的工作臺, 壓在老的上面。 方法調用完成后, 棧頂的工作臺就被銷毀了, 線程會在底下的工作臺繼續機械的干活。

      第四回 快樂假期

      第二天, 0x3704又問我要指令, 我有點生氣: 你就不會記住嗎

      0x3704說: 我可不能記住, 萬一你被重新裝載了, 指令變了怎么辦?

      我告訴他指令是"iload_0" , 他剛把數據扔到桶里, ?古怪的事情發生了, 身手敏捷的0x3704突然好像凝固了一樣,不動了。

      只聽到String歡呼: “遇到斷點了,碼農開始調試了, 我們放假了!”

      "調試?什么調試?"

      "就是碼農會單步、手工的執行這些指令,他們慢死了, 可能一秒才能執行一步, 由于我們的時間比他們快的多, 他們的一秒,簡直就是我們的10幾天, 走, 出去玩去"

      "出去玩? 能上哪兒玩” 我覺得這里無聊透頂。

      "找我們new 出來的對象玩去"

      我想到了之前聯系過我的?對象Account@659e0bfd?, 想著去看看也不錯。

      這個叫"堆"的大樓更加擁擠, 全是人, String 的對象當然最多,Stirng類左右逢源,不停的打招呼, 從我創建出來的Account對象幾乎找不到。

      一隊全副武裝的士兵不停的在巡邏, 時不時的把對象拉出來,塞到車里去。

      我是一個Java class

      “這是在干嘛啊” ?我問String類

      "這些人叫清理者, 專門清理沒有用的對象, 你看,車里那不是Account@659e0bfd?嗎"

      "?。?昨天我還和他聯系, 他怎么會沒用了呢"

      "他很有可能只是個方法的局部變量, 方法結束后, 就沒人引用了, 白白的占用空間, 你看這樓太擁擠了, 如果不清理, 很快就會住滿,系統崩潰, Out Of Memory了"

      "那這個樓就不能蓋的更高點嗎?” 我心里有點可憐這些被回收的對象們

      "樓有多高,是由碼農們決定的, 他們在啟動虛擬機的時候會指定參數"

      "那士兵咋知道誰有用沒用?"

      "引用計數唄, 如果對象被使用, 計數就會增加, 不用的時候就會減少, 如果是0 , 那就可能被清理了。"

      "那我們會被清理掉嗎?" 我擔心的問

      String類神秘的笑了下: ?"我應該不會, 但是你是有可能的"

      我當然明白了, String類是核心員工, ?而我只是從外邊加載過來的一個類而已, 不過我也確實有點想我的家了。

      果然,又過了10天,?0x3704才動彈了一下,問我要第二條指令

      我想都沒想就告訴了他:“iload_1” 。

      接下來又是10天的長假。

      第五回 真相大白

      漫長的調試假期終于結束了,我剛回到自己的工作間, ?發生了更奇怪的事情, 整個世界毫無征兆的消失了。

      我暈暈乎乎,發現還是躺在自家床上, 我是做了一場夢嗎?

      可是過去的記憶如此的真切, 到底是怎么回事?

      管它呢, 我已經知道了自己所在的房子的門牌號是?C:\workspace\myTaobao\bin\com\mytaobao\domain

      探索一下吧,唉 , 大部分人都非常無趣,不理我。

      正當我準備要回去接著睡覺的時候, 我先發現了C:\workspace\myTaobao\src\ 下也有個一模一樣的目錄com\mytaobao\domain,關鍵是里邊竟然有個Account.java !

      出生的模糊記憶告訴我, javac 就是從這里把我生成的。

      我正要給他打招呼,一個"hi"還沒說出口。

      javac 又一次運行, 我被新的Account.class 殘忍的覆蓋掉了!

      臨死前, 我終于明白了,這個一個碼農的電腦,碼農在開發程序, 調試程序, 不斷的重啟服務器。

      而我這個類隱藏著一個Bug, 經過調試后被發現, 然后Fix了!

      (全文完)

      —————END—————

      喜歡本文的朋友們,歡迎長按下圖關注訂閱號夢見,收看更多精彩內容

      Java 存儲

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Python進階必備:線程模塊threading
      下一篇:表格一直自己跳動(為什么電腦中的表格跳來跳去)
      相關文章
      jzzijzzij在线观看亚洲熟妇| 亚洲一区二区三区深夜天堂| 亚洲毛片免费视频| 久久亚洲国产成人亚| 中文字幕亚洲一区二区三区| 午夜亚洲国产理论片二级港台二级 | 亚洲日韩精品无码一区二区三区| 亚洲女同成人AⅤ人片在线观看| 一级毛片直播亚洲| 亚洲精品99久久久久中文字幕 | 久久狠狠爱亚洲综合影院| 亚洲综合无码一区二区三区| 久久久久亚洲AV无码专区体验| 中文字幕日韩亚洲| 亚洲av午夜精品一区二区三区| 亚洲国产精品无码久久98 | 久久99亚洲网美利坚合众国| 亚洲成在人线av| 亚洲av网址在线观看| 亚洲AV永久纯肉无码精品动漫| 亚洲成AV人片在线观看无| 久久久久亚洲av无码尤物| 久久精品国产亚洲夜色AV网站| 亚洲av鲁丝一区二区三区| 91亚洲一区二区在线观看不卡| 亚洲日本视频在线观看| 亚洲国产美女在线观看| 亚洲欧洲日本在线观看| 亚洲成a人片在线不卡一二三区 | 国产精品亚洲专区无码唯爱网| 国产成人亚洲综合a∨| www.亚洲色图| 国产精品亚洲美女久久久| 亚洲精品无码国产| 久久精品国产亚洲av麻豆色欲 | 狠狠入ady亚洲精品| 中文字幕第一页亚洲| 亚洲国产精品不卡在线电影| 亚洲精品中文字幕麻豆| 亚洲综合精品成人| 噜噜噜亚洲色成人网站|