Java 虛擬機總結 - JVM 內存區域

Java 虛擬機( Java Virtual Machine,縮寫爲 JVM ):是一種可以運行 Java 程序的抽象計算機。 git

特色:實現 Java 平臺無關性,使得編譯後的 Java 程序指令並不直接在硬件系統的 CPU 上執行,而由 JVM 執行。JVM 屏蔽了與具體操做系統平臺相關的信息,使得 Java 程序只需生成在 Java 虛擬機上運行的目標代碼(字節碼),再由 JVM把字節碼解釋成具體平臺上的機器指令執行,就能夠在多種平臺上不加修改地運行。github

Java 虛擬機運行時數據區

Java 虛擬機在執行 Java 程序的過程當中會把它所管理的內存劃分爲若干個不一樣的數據區域,如下是 Java 虛擬機所管理的運行時數據區:數組

Java虛擬機運行時數據區

程序計數器

和 pc 寄存器來存放下一條指令地址相似,JVM 的程序計數器可看做當前線程所正在執行(不是下一條)的字節碼的行號指示器。在虛擬機的概念模型裏,字節碼解釋器工做時能夠經過改變這個計數器的值來選取下一條須要執行的字節碼指令。多線程

Java 虛擬機的多線程是經過線程輪流切換並分配處理器執行的時間來實現的,在任何肯定的某個時刻,一個處理器都只會執行一條線程中的指令。所以,爲了線程切換後能恢復到正確的執行位置,每條線程都有一個獨立的程序計數器,即線程私有。spa

Java 虛擬機棧

描述了 Java 方法 執行的內存模型,即存放每一個方法執行時建立的棧幀,用於存放局部變量表、操做數棧、動態連接、返回地址等信息,線程私有。操作系統

本地方法棧

相似於 Java 虛擬機棧執行 Java 方法服務,本地方法棧則爲虛擬機使用到的 Native 方法服務,線程私有。線程

Java 堆

存放分配的對象實例及數組,能夠處於物理上不連續的內存空間,只要邏輯連續便可,線程共享,區域主要由垃圾收集器管理。code

方法區

存儲一個類的結構信息,例如運行時常量池、成員變量和方法數據等,線程共享。
注意:方法區≠永久代(Permanent Generation),僅僅是由於HotSpot虛擬機中使用永久代來實現方法區,以此像管理堆內存同樣來管理方法區而已。對象

運行時常量池

方法區的一部分,用於存放編譯期間生成的各類字面量(文字所表示的取值,即固定值,對於 String 而言,形如 String str="hello"這種屬於字面量,有專門的字符串池進行保存,形如String str = new String("hello")這種不屬於字面量,則是在堆上分配)和符號引用(至關於Linux中一個文件的軟連接,在該類實際執行時,才把符號引用轉爲直接引用)。內存

本文發表於我的博客:http://lavnfan.github.io/,歡迎指教。

相關文章
相關標籤/搜索