1. 程式人生 > >碼農翻身之大話程式設計篇:2我是一個Java Class

碼農翻身之大話程式設計篇:2我是一個Java Class

                                                    第一回    陌生警察        我出生在C盤下面一個很深層次的目錄下,也不知道是誰把我放在這裡的。我一直在睡覺,外邊的日出日落,風雨雷電和我一點關係都沒有。        直到有一天,有個傢伙咣咣咣砸我房門把我叫醒。這個傢伙穿著像警察的制服,左手拿著一個對講機,右手遞過來他的工作證:“你好,我是Classloader,請問你是Account類嗎?”        “是啊,怎麼了?”        這個人並沒有回答我,而是拿起了對講機:“頭兒,你看你能不能裝載這個類?”        對講機那頭好像也在問他的上司,過了半天,終於有了迴音:        “我裝載不聊,我的上級也說了,他們也裝載不聊,你來幹吧。”        “那就報數吧”這次我注意到旁邊站著一個笑眯眯的小個子。        “報什麼數?”我一臉懵逼。        “唉,果然沒有被裝載過,你是個class檔案,當然要報檔案開頭的那幾個數了,就是jdk1.0中確定的那個數啦”        “哦,我看看啊,0xCAFEBABABE”        “不錯,是個Java類,你把後面兩個數也報一下。”        “50,0”        “看來版本不夠高啊,是jdk1.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,位於最底層,贊這位在裝載一個類之前,一定要問一問幾位權利極高的大爺,請他們現狀在,這幾位裝在不聊,才由我們這些小冰來出馬。”
        “這樣子能避免黑客攻擊?”        “能啊,你想,那個黑客寫的攻擊類,我們在裝載之前,肯定要請示大爺來裝在,由於其時核心員工,肯定他們會先裝載啊,這樣這些大爺就直接將String傳給我們了,我們就不會裝載黑客類了。”        “你能不能少說兩句”Classloader似乎生氣了。        我和檔案驗證器只好禁聲。        其實檔案驗證器也不是隻會給我吹牛,他也很敬業,這傢伙在車上把我的全部的位元組碼都要了過去,對這些天輸一半的東西一遍一遍地進行檢查分析,確保每個指令都是正確的,檢查是不是有超類,是不是覆蓋了final方法,跳轉指令是不是正確                                        第三回    初試虛擬機器
        很快我們就來到了目的地,我一看虛擬機器不就是幾個大樓嗎,不過這幾個大樓可真是高啊。        他們倆把我帶進一座叫做“方法區”的大樓,進了電梯,輸入2048,很快來到2048層,無數的格子間平鋪開來,他們七拐八拐,輕鬆地把我帶進到了我的位置,上面寫著我的名字“com.mytaobao.domain.Account”。        我問檔案驗證器:“這樓這麼高,這麼多格子間,人會坐滿嗎?”        “只有極少情況會坐滿,一旦滿了,就會丟擲異常,我們就完蛋了。你好自為之吧,再見。”他們把我安頓好就離開了。        我往周邊一看,咦,這不是著名的java.lang.String嗎。我本想和他打個招呼,可他的電話似乎一直沒斷過,嘴裡一直說著什麼store,load之類我聽不懂但是有點熟悉的話。正無聊著呢,我電話響了,電腦螢幕也涼了,我看到一個人對我笑著說:“你好,我剛剛new出來的Account物件,我的編號是[email protected]        暈倒!這傢伙和我什麼關係?看我一臉詫異,他說:“很快就會有個執行緒到達CPU車間了,他會聯絡你,我就是確認下你在不在,奧對了,我在一個叫做堆的地方,有空找我玩啊,byebye”,說完就消失了。        果然沒多久,視訊電話又響了。這次我看到一個人站在一個明亮的車間,抱著一個包裹,她按了一個按鈕,面前like升起一個工作臺,臺子上立了一個有很多抽屜的櫃子,每個抽屜上都有一個編號,旁邊還有一個深桶。(後來我就知道,那個櫃子的學名叫做區域性變區,那個桶叫做運算元棧)        我正想問問怎麼回事呢,就聽到了他的聲音:“我是執行緒0x3704,我要呼叫你的第二個方法了”我一看,我的第二個方法是add:        Public void add(int x ,int y ){    x = x + y ; }        “請把第一條指令給我說一下”0x3704繼續問我要東西。我還不太熟練,找了半天才說:“iload_0”於是他就從櫃子裡的機械手吧一號抽屜的一個數30 扔到了工作臺上的一個桶裡,這個桶很窄,沒法並排放兩個數,但是很深。
        然後他又說:“下一條指令”        “iload_1”        於是一號抽屜的一個數40也被扔到了桶裡,從桶上面就看不到30了。
        “下一條指令”        “iadd”        於是他就把兩個數從桶裡取出來,做了個飛快的動作,這兩個數變成了一個數70,然後他又把70放到了桶裡。
        “下一條指令”        “istore_0”        於是他又把70從桶裡撈出來,放到了櫃子上編號為0的地方,之前的30就被扔掉了。我看的目瞪口呆,這貨在幹嘛?        我問他:“不是吧兩個數加起來嗎?為啥搞的這麼麻煩?”他不理我,知識繼續說“下一條指令”。我只有配合他進行下去。        java.lang.String難的悠閒,端著一杯咖啡一邊看我手忙腳亂地取指令,一邊說:“新人都這樣,彆著急,等你熟練了,閉著眼睛就搞定了,就像我一樣,你可能不知道,我們這個虛擬機器叫做基於堆疊的虛擬機器,看到那個桶沒有,其實就是個先進後出的棧啊,我們虛擬機器的所有指令其實都是對棧進行操作。”        可是我還是好氣:“這棧有什麼好啊?”旁邊的格子間java.util.Stack立刻說:“這事兒你得問我啊,怎麼說呢,主要是為了簡單,你看我們只用一個簡單的棧,就能完成所有的工作,你做的就是往棧裡扔東西(入棧),然後從最上面拿東西(出棧)就行了。不像Intel的CPU,搞了巨多的桶,每個桶只能容納一個數,他們還美名其曰七寸器,做加法的時候,先把一個數放到第一個桶,再把另一個數放到第二個桶,加起來以後的結果害的你找個桶,有些桶還不通用,這麼多桶找起來麻煩死了。”        “可是我們的棧操作起來就麻煩了啊,你看一個簡單的假髮都得操作半天”,我不依不饒地說。“可是我們的指令可以優化啊,不過我不太懂”        這個遊戲我整整玩了一天,沒有現成找我的時候,我就閒著,String說的對,熟練以後簡直太簡單了。        String就不一樣了,幾乎每時每刻都有執行緒給他打電話要指令,沒辦法,String確實是虛擬機器的骨幹和經營,使用頻繁,業務純屬,忙而不亂。有時候我會看到執行緒佈置一個工作臺,而是一摞子工作臺,也是一個壓一個,執行緒們都很老實,永遠在最上面那個工作,從來都不會先幹下面的活。
        我問java.util.Stack:“這些工作臺也是棧吧”“猜得不錯,學名叫做Java棧,每個執行緒都有一個,其中的每個工作臺你都看過了,學名叫做棧幀,知道不?每個臺子都代表一個方法呼叫,這一羅工作臺就是方法呼叫方法導致的啊”        確實是,因為我發現一旦呼叫新方法,就會立刻形成一個新的工作臺,壓在老的上面。方法呼叫完成後,棧頂的工作臺就銷燬了,執行緒會在底下的工作臺繼續機械的幹活。                            第四回    快樂假期        第二天,-x3704又問我要指令,我有點生氣:“你就不會記住嗎?”他說:“我可不能記住,萬一你被重新裝在了,指令變了怎麼辦?”        我告訴他指令是“iload_0”,他剛把資料扔到桶裡,古怪的事情發生了,神獸敏捷的0x3704突然好像凝固了一樣,不動了。        只聽到String歡呼:“遇到斷點了,碼農開始除錯了,我們放假了!”        “除錯?什麼是除錯?”        “就是碼農會單步,手工執行這些指令,他們慢死了,可能一秒才能執行一步,由於我們的時間比他們快得多,他們的一秒,簡直就是我們的只幾天,走出去玩去”        “出去玩?能上哪玩?”        “我們去找我們new出來的物件玩去”我想到了之前聯絡過我的物件[email protected]想著去看看也不錯。        這個叫做堆的大樓更加擁擠,全是人,String的物件當然最多,String類左右逢源,不停地打招呼,從我創建出來的Account物件幾乎找不到。        一隊全副武裝的士兵在不停地巡邏,時不時地吧物件拉出來,塞到車裡去。        “這是在幹嘛啊”我問String類。“這些熱那叫清理著,專門清理沒有用的物件,你看,車裡那個不是[email protected]        “啊?昨天我還和他聯絡,她怎麼會沒用了呢?        “很可能他只是個方法的區域性變數,方法結束之後,就沒人飲用了,拜拜佔用空間,你看這樓太擁擠了,如果不清理,很快就會住滿,系統崩潰,out of memory了”        “那這個樓就不能蓋得更高點嗎?”我有點可憐這些被回收的物件們。        “樓有多高,是由碼農們決定的,他們在啟動虛擬機器的時候就會制定引數。”        “那士兵怎麼知道誰有沒有用?”        “引用計數唄,如果物件被使用,計數就會增加,不用的時候就會減少,如果時0,那就可能被清理了。”        “那我們會被清理掉嗎?”        “我應該不會,但是你時有可能的。”我當然明白,String時核心員工,而我只不過是一個外邊載入過來的一個類而已,不過我也確實有點想我的家了。        果然,又過了十天,0x3704才動彈了一下,問我要第二條指令。我告訴了他“iload_1”接下來又是十天的長假。                    第五回    真相大白        漫長的除錯假期終於結束了,我回到了自己的工作間,發生了更加奇怪的事情,整個世界毫無徵兆的消失了。        我暈暈乎乎,發現自己還是躺在自家床上,我是做了一場夢麼?可是過去的記憶如此真切,到底是怎麼回事?        管他呢,我已經知道了自己所在的房子的門牌號:C:\workspace\myTaobao\bin\com\mytaobao\domain探索一下吧,唉,大部分人都非常無趣,不理我。        正在我準備回去接著睡覺的時候,我先發現了C:\workspace\myTaobao\src\ 下也有一個一模一樣的目錄com\mytaobao\domain,關鍵是裡邊竟然有個Account.java !出生的模糊記憶告訴我, javac 就是從這裡把我生成的。         我正要給他打招呼,一個“hi”還沒說出口,我就被新的Account.class覆蓋掉了。        臨死前,我終於明白,這個碼農在開發程式,除錯程式,不斷地重啟伺服器。而我這個類隱藏著一個bug,經過除錯之後被發現,然後fix了。

相關推薦

翻身大話程式設計2一個Java Class

                                                    第一回    陌生警察        我出生在C盤下面一個很深層次的目錄下,也不知道是誰把我放在這裡的。我一直在睡覺,外邊的日出日落,風雨雷電和我一點關係都沒有。     

薦書丨好玩有趣的程式設計知識就在《翻身

點選上方“程式人生”,選擇“置頂公眾號” 第一時間關注程式猿(媛)身邊的故事 用故事給技術加點料! 好玩又有趣的程式設計知識! 全網閱讀量近1000萬次的技術故事! 優秀的技術人員應該具有廣闊的技術視野,同時擁有貫通的技術深度;不僅知道技術是什麼,而且還懂得為

翻身——搞懂了這幾點,你就學會了Web程式設計

做了那麼多年Web程式設計,仔細想想, 其實本質上就那點事兒, 你抓住了幾個重點問題, 學起來一點都不難。 B/S 是從 90年代的客戶端/伺服器端發展而來, 共同點都是由一個(或一組)伺服器來服務多個客戶端。  差別在於:首先,C/S結構的客戶端可能是由不同語言編寫

翻身——RedisMySQL算老幾?

前言:上一篇《MySQL:快取算什麼東西?》裡挖了一個坑,也有很多人說沒看過癮,今天接著寫,把坑填上,不過得把視角換一下,讓Redis上臺發言。 我知道MySQL看我不順眼,不就是他的好基友Tomcat不怎麼搭理他了嗎? 這能怪我? 誰讓他那麼慢? 張大胖把我Redis安

網路簡介網絡卡跟路由器是如何讓你上網的——《翻身》閱讀筆記

聯網是這樣的,首先,你的電腦上必須要有網絡卡,否則上不了網。這章是動態撥號上網 每個網絡卡都有一個固定的MAC(Media Access Control)地址。也稱為實體地址。MAC地址由產商決定,就像身份證號碼,一般不可更改。如:11:27:F5:8A:79:54   可

後端談前端(CSS)第五課CSS樣式

一、背景: CSS 允許應用純色作為背景,也允許使用背景影象建立相當複雜的效果。 1、背景色 可以使用 background-color 屬性為元素設定背景色。這個屬性接受任何合法的顏色值。 例如: p {background-color: gray;} 2、背景影象 要把影象放入背景,需要使用 bac

後端談前端(CSS)第六課盒子模型

元素框的最內部分是實際的內容,直接包圍內容的是內邊距。內邊距呈現了元素的背景。內邊距的邊緣是邊框。邊框以外是外邊距,外邊距預設是透明的,因此不會遮擋其後的任何元素。 提示:背景應用於由內容和內邊距、邊框組成的區域。 一、CSS 內邊距屬性 屬性 描述 padding 簡寫屬性。作用是在一個宣告中

後端談前端(CSS)第七課定位與浮動

一、定位: 1、定位的理解 (1)相對定位 相對定位是一個非常容易掌握的概念。如果對一個元素進行相對定位,它將出現在它所在的位置上。然後,可以通過設定垂直或水平位置,讓這個元素“相對於”它的起點進行移動。 如果將 top 設定為 20px,那麼框將在原位置頂部下面 20 畫素的地方。如果 left 設定為 3

翻身Java帝國

這位大俠,這是我的公眾號:程式設計師江湖。 分享程式設計師面試與技術的那些事。 乾貨滿滿,關注就送。 《碼農翻身》讀書筆記之Java帝國 Java帝國(Java語言發展,JVM和class,持久化和IO,JDBC與DP,JTA與分散式事務,JSP與se

翻身講網路5Web安全攻防戰與HTTPS

瀏覽器:一個家族的奮鬥 原創: 劉欣 碼農翻身 2017-12-12 我是你們每天都要使用的瀏覽器,自從90年代誕生以來,我們這個大家族變得非常的繁榮,在過去的幾十年中,我們一直兢兢業業地幫助你們人類去探索外部的網際網路世界。隨著網際網路和移動網際網路的發展,我們家族終

iOS開發網路程式設計同步,非同步請求差異及用法

在網路請求方式上,有同步和非同步之分,相關內容涉及到執行緒部分知識,這一節咱們需要知道如何去傳送一個同步或者非同步的請求,以及它們二者的區別。 一、同步請求 在網路程式設計第二篇,咱們寫的get,post請求使用的都是同步請求,那結合同步非同步、get/post組

翻身浪潮巔的Web

《碼農翻身》讀書筆記之浪潮之巔的Web 這是我的後端讀書筆記系列文章的第三篇,選取的是最近剛剛圈粉的知名博主劉欣創作的《碼農翻身》。 本文內容主要根據知名博主劉欣一作《碼農翻身》的內容總結而來,本書的內容風趣幽默,講解計算機理論原理也是十分透徹,由於書中常常

翻身講作業系統2程序,執行緒與作業系統那些事

我聽說我的祖先們生活在專用計算機裡, 一生只幫助人類做一件事情,比說微積分運算 了、人口統計了 、生成密碼、甚至通過織布機印花 ! 如果你想在這些專用“計算機”上乾點別的事兒,例如安裝個遊戲玩玩, 那是絕對不可能的, 除非你把它拆掉, 然後建一個全新的機器。 而我這些祖

幹貨 | 翻身提高工作效率的必備工具

ron lob 識別 書單 我們 per 高效 pytho 領域 要問闖蕩江湖的碼農最怕什麽 那麽,我鬥膽猜測一下 一定是敲代碼的 …… 速度 速度 還是速度! 速度是效率的關鍵 決定幾點回家 幾點見到心愛的妞 幾點吃雞 …… 今天,本黑就來給大家推薦一下 程序員提高效

【讀書筆記】翻身 - 簡介

it行業 內容 讀書筆記 是我 筆記 然而 人生 軟件行業 積累 作為一個從業12年的老碼農來說,經歷了軟件行業十年來的滄海桑田,套用IT行業的一個術語 - “變化是永恒的”。然,追求真理,追求解決問題的金鑰匙是我們這個行業乃至人生的重要目標之一。軟件行業沒有銀彈可以解決一

【讀書筆記】翻身 - 老司機的精進

成了 自己 java 進階 創新 soc 代碼 接管 node “凡事必先騎上虎背”作為來自孔子故裏的老司機,也難免沾染上儒家的中庸之道,缺少了開拓創新的精神。“凡事預則立,不預則廢”是對的,但也不必苛求盡善盡美。“不在其位,不謀其政”在我看來並不讓人奮進,畢竟 - 不想

晚上9點的北京地鐵站,角落敲程式碼!網友一看就知線上bug!

作為一名程式設計師,想必大多數人都有著解決線上問題的經歷吧,既然是線上問題,肯定是刻不容緩,每時每刻都在影響著使用者的體驗與公司的營收情況,為了讓損失能夠最小化,偉大的程式設計師們就必須做出一點犧牲去解決這件事情了,當然,大部分程式設計師都是比較敬業的,對於隨時隨地解決線上問題的意識都是有的,經常能

翻身》用故事給技術加點料

這本書以故事的形式講解一些技術詞彙,總的還是比較適合理解和閱讀的,不懂的人理解更簡單,原本就理解的人就學會一種講述的方法。能通俗易懂、形像生動的把專業東西讓小白明白,是一件很不錯的事。 因為本人沒搞Java,也就把第2章大部份跳過了,,似乎作者應該是學Java的吧。 聯絡到最近希望給家裡

翻身——到底是Java好還是Python好?

語言的優劣之爭是個永恆的話題,有時候一次偶然地“擦槍走火”甚至可能會引發一場鐵桿粉絲之間的“戰爭”。   也經常有人問我:“老劉,到底是Java好還是Python好? 我應該學習哪個語言?” 我也挺為難的,只好說道:  Python挺適合入門的,看起來很簡單

的職場人生一由張小平離職引發的一些吐槽

文  ▏村長好忙(訂閱號ID:xiejun_asp)      9月27日刷爆朋友圈的一篇文章 《離職能直接影響中國登月的人才,只配呆在國企底層》,雖然存在誇大其詞且很多細節不實,但是還是讓張小平離職登上了微博熱搜榜。引發了我一丟丟的小感觸,忍不住來說說我這幾年所經歷的職場。 01 — 個人成長     不