都說搞C的牛叉,那是因為C解決問題,全靠程式員自己。而我們Java有異常機制,數組越界了會提示,開發效率也比C高,不需要程式員對底層瞭解太多,這一切的一切都歸功於Java Virtual Machine-Java虛擬機。JVM其實就是一個抽象的電腦,它有自己的指令集,有自己的機器語言(ByteCo... ...
都說搞C的牛叉,那是因為C解決問題,全靠程式員自己。而我們Java有異常機制,數組越界了會提示,開發效率也比C高,不需要程式員對底層瞭解太多,那是因為最困難的問題,已經被前人解決了,Java Virtual Machine-Java虛擬機。JVM其實就是一個抽象的電腦,它有自己的指令集,有自己的機器語言(ByteCode,Class文件),它幫我們管理記憶體,線程等,本系列會一一解開它的真面目。
本文基於Java HotSpot™ 虛擬機,JDK 1.8,將討論:
- JVM記憶體模型
- JVM記憶體管理
圖 1 JVM內部結構
一個程式執行的過程是這樣的,以C語言為例,源代碼首先被編譯成可執行文件,以二進位的形式存放到磁碟上,當執行時,首先從磁碟載入到記憶體中,然後處理器就開始執行目標程式中機器指令。反觀Java,首先編譯成位元組碼文件,與平臺無關,JVM通過ClassLoader載入到記憶體中,然後執行其中的機器指令,JVM幫我們跟操作系統打交道。有了位元組碼和JVM,Java實現了平臺無關性。由上圖可知,JVM記憶體主要由以下幾個部分組成:
1. Heap
堆,這是一個非常重要的區域,基本所有的對象實例都在這裡分配,大部分的垃圾回收也發生在這裡。它被所有線程共用,