深入理解Java虛擬機過時了嗎?
本不想來回答這個問題,但看到下面那個Java高級架構獅,只是直接放出了java虛擬機的內存結構圖,覺得還是有必要來說下這個問題的。
先談是不是過時的問題。
《深入理解Java虛擬機》所針對的是JDK版本和變更現在我們在國內可以讀到的《深入理解Java虛擬機》應該是它的第2版吧,我沒有去查過,有沒有更新的版本,大致長這樣
它所針對的,主要是JDK7的規范,那么,從JDK7到現在的JDK 12正式發布,應該說JDK已經在各方面,都發生了很大的變化。
考慮到目前在整個業界,甚至連JDK8的規范,其實還普及未久,那么,簡單的就以JDK7和JDK8下,關于PermGen空間的事情,來做個例子。
在《深入理解Java虛擬機》的2.4.3中,談到了運行時常量池的溢出,其中給出了一個說明,即:
但估計你照此去理解JDK8及其以后的虛擬機,恐怕要抓瞎,因為,從JDK8開始,已經沒有PermGen空間了,取而代之的是Metaspace。
當然,這不是什么大的問題,但也說明實際上,這么多年,JDK也在與時俱進的發展著,所以:
如果你沒有很深的對JDK當前特性的認識,那么,可能會在一些方面,走入到知識的誤區——不是因為它說的不對,而是它已經過時了考慮到大部分人,是要從事實際的開發工作,而不是考古工作,因此花很多時間,學習一個舊的知識結構,恐怕并不非常高效。
那么,這本書能不能讀呢?
答案是:能原因無他,不是因為它不過時,而是因為:
暫無特別好的替代品,它算是所有講類似這一主題的Java書籍中,針對版本最新的一本你可以說是一種無奈,但也折射出另一種現實,就是其實這是一個非常小眾的市場,說白了,其實愿意深入學習和研究這個方面的人,是不多的。
我不清楚提問者的背景,但如果你要問我,是不是推薦學習Java語言和其下應用開發的人,去閱讀下《深入理解Java虛擬機》,那么,我的答案,則恐怕會是:
不推薦大家讀原因無他,因為關于構建一個虛擬機的基本的理論,其實在整個Java的世界中,可能沒有你想象的那么重要,而在實際的工作中:
工程師的思維,很大幾率不是從理論,到實踐當我們寫下:
時,這個東西,放在棧中,還是堆中,會怎樣去影響最后的垃圾回收,其實我們不care,很多時候,即便寫出來了非常規范的代碼,恐怕也并非因為我們已經深入的了解了垃圾機制背后的原理,而純粹是一種經驗習得。
而類似的源碼級別的深入(這本書還不是),如果有人想寫,可以寫無數,比如可以有:深入理解
.Net
虛擬機,深入理解Nginx源代碼,......我覺得,它們統統可以歸入一類:聽起來虛張,讀起來吃力,讀完了,好像就是讀完了,僅此而已不是說它們不重要,而是對于你的工作來說,可能用不著,而人這玩意兒,竟然有遺忘曲線這樣的大Bug存在。
如果你真的想了解這方面的東西,我到推薦另外的一本書,滿滿的工程師風格:
《自己動手寫Java虛擬機》:一本用GO實現Java虛擬機的實操書最后,真心要抨擊一下現在有的公司的招聘:
你就是要招一個Java語言的開發崗,但你一定要在面試時,去逼問他:JVM的底層是什么?還美其名曰,這體現了這個人,對Java語言的認識程度。
這真的有意義么?