1. 程式人生 > >深入理解Java虛擬機——java內存區域與內存溢出異常(一)

深入理解Java虛擬機——java內存區域與內存溢出異常(一)

線程 文件的 語言 沒有 虛擬 深入理解java 十倍 並且 周期

Java虛擬機全稱:java virtual machine;是Java開發語言中,用來運行Java字節碼文件的平臺;通俗的講,就是一個程序。它提供對Java字節碼的解釋及運行,從而使Java語言能獨立於各個系統平臺。

Java虛擬機在執行Java程序的過程中會把它所管理的內存劃分為若幹個不同的數據區域。這些區域都有各自的用途,以及創建和銷毀時間。Java虛擬機所管理的內存包括以下幾個運行時數據區域:
1)程序計數器: 可以看作是當前線程所之行的字節碼的行號指示器。字節碼解釋器就是通過改變計數器的值來選取下一條需要執行的字節碼指令。Java虛擬機的多線程是通過線程輪流切換並分配處理器執行時間的方式實現的。在任何一個確定的時刻,一個處理器都只會執行一條線程中的指令。因此每個線程都需要一個獨立的程序計數器。
2)Java虛擬棧:與程序計數器一樣,也是線程私有的。生命周期和線程相同。
3)本地方法棧:為虛擬機使用到的Native方法服務。
4)Java堆:Java堆十倍所有線程共享的一塊內存區域,在虛擬機啟動時創建。此內存區域用於存放對象實例。Java堆是垃圾收集器管理的主要區域。
5)方法區:同樣也是所有線程共享的區域,用於存儲已被虛擬機加載的數據。
6)運行時常量池:是方法區的一部分。用於存放編譯期生成的各種字面量和符號引用。
7)直接內存:

虛擬機遇到一條new指令時,首先將去檢查這個指令的參數是否能在常量池中定位到一個類的符號引用,並且檢查這個符號引用代表的類是否已經被加載、解析和初始化過。如果沒有,則必須先執行相應的類加載過程。(p45)
 

深入理解Java虛擬機——java內存區域與內存溢出異常(一)