1. 程式人生 > >jvm——執行時資料區域

jvm——執行時資料區域

執行時資料區域 --摘自《深入理解java虛擬機器》 java虛擬機器在執行java程式的過程中會把他所管理的記憶體劃分為若干個不同的資料區域,他們各有用途,以及建立和銷燬的時間。包括以下幾個區域: 程式計數器、java虛擬機器棧、本地方法棧、java堆、方法區,下面我們會逐個詳細的介紹他們。 程式計數器:是一塊較小的記憶體空間,可以看作是當前執行緒所執行的位元組碼行號指示器。位元組碼直譯器工作室就是通過改變這個值來選去先一條需要執行的位元組碼指令。每個執行緒都有一個獨立的程式計數器,互不影響獨立儲存,執行緒私有。java方法計數器記錄正在執行的虛擬機器位元組碼指令的地址,本地方法則為空(undefined)。沒有記憶體溢位。 java虛擬機器棧:

執行緒私有,宣告週期與執行緒相同,描述java方法執行的記憶體模型:每個方法執行時都會建立一個棧幀,用於儲存區域性變量表、運算元棧、動態連線、方法出口等資訊。每個方法從呼叫到完成,就是一個棧幀在虛擬機器棧中出棧和入棧的過程。如果執行緒請求的棧深度大於虛擬機器所允許的棧深度會跑出stackOverFlowError,如果科動態擴充套件並切申請不到足夠記憶體會跑出outOfMemoryError異常。 區域性變量表: 存放各種基本資料型別(boolean、byte、char、short、in、long、float、double)、物件飲用和returnAddress型別。在編譯期間就完成分配確定了佔用記憶體的大小,執行期間不會改變。 **本地方法棧:**虛擬機器只用到的native方法服務。其他與虛擬機器棧類似。 java堆:
被所有執行緒共享的記憶體區域。唯一目的:存放物件例項,幾乎所有的物件例項都在這裡分配記憶體。又稱“GC堆”,由於現在垃圾收集器都是分代收集演算法,所以java堆還可以細分為新生代和老年代。可同過-Xmx和-Xms控制;沒有記憶體完成例項分配,並且堆無法再擴充套件時,會丟擲OutOfMemoryError異常。 方法區: 執行緒共享記憶體,用於儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等。Non-Heap(非堆)。 **執行時常量池:**方法區的一部分,class檔案中除了版本,欄位,方法,介面等描述資訊外,還有一項資訊是常量池,用於存放編譯期聲稱的各種字面量和符號引用。這部分將在累加在後進入方法去的執行時常量池中存放。一般來說除了儲存Class檔案中描述的符號飲用外,還會把翻譯的直接引用也儲存在執行時常量池中。OutOfMemoryError異常 **直接記憶體:**並不是虛擬機器執行時資料區的一部分,也不是java虛擬機器規範中定義的記憶體區域,但是被頻繁使用,也可能到時OutOfMemoryError異常。在JDK1.4 中新加入了NIO(New Input/Output)類,引入了一種基於通道(Channel)與緩衝區(Buffer)的I/O 方式,它可以使用native 函式庫直接分配堆外記憶體,然後通脫一個儲存在Java堆中的DirectByteBuffer 物件作為這塊記憶體的引用進行操作。這樣能在一些場景中顯著提高效能,因為避免了在Java堆和Native堆中來回複製資料。 本機直接記憶體的分配不會受到Java 堆大小的限制,受到本機總記憶體大小限制 配置虛擬機器引數時,不要忽略直接記憶體 防止出現OutOfMemoryError異常