轉自:https://mp.weixin.qq.com/s/EjVfk1iOuQUjLfPxt_DJ7Qhtml
是大名鼎鼎的Java 虛擬機, 聽說這個星球上天天有900多萬程序員和我打交道,這真是一個驚人的數字。 這900多萬人中很多人對個人技術內幕很是感興趣, 有事兒沒事兒都要把我「大卸八塊」, 深刻了解一下。甚至還有人從個人出生地--源代碼--開始看起,弄得人家連一點隱私都沒有了。java
固然也有不少人對個人運行機理愛理不理, 理由很簡單: Java虛擬機相關的事情只有在面試時纔會問道,背誦一下那些垃圾回收算法,應付過去就能夠了!程序員
真的是這樣嗎? 面試官爲何喜歡問JVM原理? 難道他們沒什麼可問的了? 或者是隻是爲了展現他們的卓爾不羣? 高人一等?壓你一頭?面試
我想都不是, 請注意一下個人名字: Java虛擬機, 我是一個虛擬機啊!算法
雖然不是像VMWare, VirtualBox那樣能夠徹底虛擬出一個包括內存,硬盤,CPU的硬件計算機出來, 我至少也是個Soft CPU啊, 有本身的指令集,有本身獨有的可執行文件格式, 有本身獨特的基於棧而不是寄存器的執行方式,還有那久經考驗的垃圾回收機制......數據庫
做爲一個口口聲聲說熱愛編程,立志有寫出偉大軟件來改變世界的程序員, 少年, 難道你居然對這麼有趣的東西視而不見?編程
對軟件技術的好奇心是你最終成爲偉大程序員的第一驅動力, 若是你對技術不肯意深究, 不肯意瞭解背後的原理,若是你不肯意像一個調皮搗蛋的熊孩子那樣把一個玩具變成零件,而後再組裝起來(嗯, 實際上永遠都組裝不起來了) , 我真的懷疑你在這個行業能呆多久,走多遠。c#
我剛纔提到了有趣, 那真的有用嗎?安全
表面上看是沒有用處的,至少短時間看來是沒有用處的, 你寫程序,運行程序,而後吃飯,睡覺。微信
管你什麼基於棧的虛擬機,什麼方法區,堆, 垃圾回收, 生活很美好,世界也很大, 我想去看看, 不要用這些煩心事來煩我。
若是你想一直生活在軟件開發的表層, 那確定是沒有問題的, 若是你想像Neo那樣,把這個世界看個清清楚楚,明明白白,真真切切, 就須要修煉一下內力, 作爲Java 程序員, 理解Java虛擬機就是那個扎馬步的基本功。
舉個例子, 理解Class 文件格式, 就能理解ASM是怎麼在運行時「艱難的」動態生成字節碼的, 而後就會知道CGLib是怎麼改善它, 讓它容易使用的。 而CGLib但是Spring AOP賴以生存的一大基礎啊。 這一路走來,是否是對AOP的理解更加透徹了?
你腦海中甚至能想象出來字節碼怎麼被動態的建立,被Classloader 加載, 造成新的Class, 而後對你的業務類進行攔截的過程。
看透世界的感受不要太爽, 若是你非要說我會用Spring 的AOP就好了, 那我也沒辦法, 人各有志嘛。
擴展一下, 如今個人家中上入住了很多動態語言, Jython, JRuby , Clojure , Scala 等等, 他們可都須要動態的生成字節碼來運行啊(碼農翻身備註: Scala 也能夠直接編譯成class 文件), 你看看理解了Class 文件格式得有多大的好處。
還有啊, 理解了一些重要的字節碼指令之後,你就會知道所謂的面向對象, 尤爲是你寫的那些個漂亮的OO代碼, 在我這裏已經「退化」成函數調用了, 不知道你會不會沮喪, 可是沒有辦法, 我們計算機的本質就是這樣,順序,循環,分支, 函數調用。 做爲補償, 我會讓你瞭解多態的祕密, 這但是不少面嚮對象語言的基礎。
說到函數調用, 你寫的Java程序在運行時會造成的棧幀, 這可真是一個超級重要的概念, 不只在我這裏有,物理CPU和內存在運行本地代碼的時候也有,雖然我和他們的結構不一樣, 但都是爲了完成一個目的: 表達一個函數在運行時的結構。
瞭解了這個傢伙, 你就知道函數在機器級是怎麼調用的, 參數是怎麼傳遞的, 遞歸是怎麼回事, 尾遞歸是怎麼回事(我居然不支持!) 。 也許你會跑去看看彙編, 去看看緩衝區溢出攻擊, 各類知識點開始鏈接,造成一張大網,這種感受是極爽的。
這樣的例子我還能夠舉出不少,可是估計不少人已經不耐煩了,就此打住。
大家人類說計算機是門科學, 可是科學的成分在哪裏呢? 在我看來更像一門工程或者技術, 核心的基礎概念真的很少, 花點功夫把他們掌握了,受益終生。
前些天我偷偷地閱讀了大家的小說《天龍八部》, 裏邊的掃地僧可真是厲害, 輕輕鬆鬆就把慕容博和蕭遠山兩位絕頂高手製得服服帖帖,老老實實, 這說明的什麼問題? 內功的修煉真是很重要啊。
jvm.png
JVM(Java Virtual Machine)Java 虛擬機是整個 java 平臺的基石,是 java 系統實現硬件無關與操做系統無關的關鍵部分,是保障用戶機器免於惡意代碼損害的屏障。Java開發人員不須要了解JVM是如何工做的,**可是,**瞭解 JVM 有助於咱們更好的開(通)發(過) java(公司) 程(面)序(試)。
寫這篇文章的目的:
本篇文章將會介紹一下內容:
要想說明白什麼 JVM 就不得不提另外兩個概念,JRE 和 JDK,初學者老是把這幾個概念搞混
java-tutorial.png
Jvm,Jre,Jdk 都是 java 語言的支柱,他們分工協做。但不一樣的是 Jdk 和 Jre 是真實存在的,而 Jvm 是一個抽象的概念,並不真實存在。
JDK
JDK(Java Development Kit) 是 Java 語言的軟件開發工具包(SDK)。JDK 物理存在,是 programming tools、JRE 和 JVM 的一個集合
jdk.png
JRE
JRE(Java Runtime Environment)Java 運行時環境,JRE 物理存在,主要由Java API 和 JVM 組成,提供了用於執行 java 應用程序最低要求的環境。
jre.png
JVM
JVM(Java Virtual Machine) 是一種軟件實現,執行像物理機程序的機器(即電腦)。
原本,Java被設計基於從物理機器分離實現WORA( 寫一次,隨處運行 )的虛擬機上運行,雖然這個目標已經幾乎被遺忘。
JVM 並非專爲 Java 所實現的運行時,實際上只要有其餘編程語言的編譯器能生成正確 Java bytecode 文件,則這個語言也能實如今JVM上運行。
所以,JVM 經過執行 Java bytecode 可使 java 代碼在不改變的狀況下運行在各類硬件之上。
jVM 有以下特色:
**Java bytecode **
爲了實現WORA,JVM使用Java字節碼,java(用戶語言)和機器語言之間的中間語言。
該Java字節碼是部署Java代碼的最小單位。
基於安全方面考慮,JVM 要求在 class 文件中使用許多強制性的語法和機構化約束,但任意一門功能性語言均可以表示爲一個能被 JVM 接受的有效的 class 文件。做爲一個通用的、機器無關的執行平臺,任何其餘語言的實現者均可將 JVM 看成他的語言產品交付媒介。
JVM 中執行如下操做:
JVM 提供定義了:
先看一下 java 代碼執行過程
轉自: 純潔的微笑 純潔的微笑 3月11日
2016年左右的時候讀了周志明《深刻理解Java虛擬機:JVM高級特性與最佳實踐》,讀完以後受益不淺,讓我對Java虛擬機有了一個完整的認識,這是Jvm書籍中最好的讀物之一。
後來結合實際工做中遇到的問題,寫了一系列關於Jvm的文章,其中開篇的幾篇內容大部分參考於此書,後期加入本身一些實戰的理解,轉載了幾篇高質量的文章,就造成了此係列讀物。
在金三銀四的跳槽季中,不少小夥伴們都已經蠢蠢欲動,將此係列文章整理出來,但願能夠幫助到你們。
第一篇文章講的是Java類的加載機制,也是我在博客園最收歡迎的Jvm文章,讀完以後你會了解什麼是類加載器、類加載機制、雙親委派模型等內容。
這篇文章描述了Java虛擬機的內存結構,內存每一個區域做用,如何經過參數對各個區域進行控制。
講述了Jvm垃圾回收的經典算法,以及各類垃圾回收機制,對象存活判斷等。
這篇文章講述瞭如何經過Jvm命令去調優,各Jvm命令使用方法。
這是很是有名的一張圖,簡單明瞭展現了GC日誌的構成
文章介紹如何分析GC日誌來診斷Java項目的運行狀態,GC分析是生產調優的重要手段之一。
一名網友根據GC日誌,進行Jvm調優的經典案例
介紹了Jvm調優各類工具的使用
如何你只是想經過面試,其實只要看一篇就夠了,這篇文章將Jvm中的關鍵知識點進行了彙總。
翻譯自國外的一篇Java GC文章,文章詳細描述幾種GC調優的方式,值得借鑑。
也是線上一場線上Jvm實戰調優的經歷,看着挺爽。
Java 8 Jvm內存變化
杜琪翻譯的 Java 8 的新特性。
咱們曾經線上出現事故後,定位分析的經歷,結局出乎意料。
微信公衆號【Java技術江湖】一位阿里 Java 工程師的技術小站。(關注公衆號後回覆」Java「便可領取 Java基礎、進階、項目和架構師等免費學習資料,更有數據庫、分佈式、微服務等熱門技術學習視頻,內容豐富,兼顧原理和實踐,另外也將贈送做者原創的Java學習指南、Java程序員面試指南等乾貨資源)