java虛擬機器記憶體劃分
java虛擬機器記憶體區域
參照官方文件 1.8版本
Oracle虛擬機器記憶體劃分文件 :https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5
The Java Virtual Machine defines various run-time data areas that are used during execution of a program. Some of these data areas are created on Java Virtual Machine start-up and are destroyed only when the Java Virtual Machine exits. Other data areas are per thread. Per-thread data areas are created when a thread is created and destroyed when the thread exits. 大概意思就是:Java虛擬機器定義了在程式執行期間使用的各種執行 時資料區域。其中一些資料區域是在Java虛擬機器啟動時建立的(例如堆、方法區),僅 在Java虛擬機器退出時銷燬。其他資料區域是每個執行緒。執行緒資料區 域是線上程退出時建立和銷燬執行緒時建立的(虛擬機器棧、本地方法棧、程式計數器)。 The pc Register(程式計數器或者pc暫存器): 程式計數器是執行緒私有的,如果執行緒執行的不是native 方法,則它儲存的是當前虛擬機器執行的java指令地址。 如果是native方法,則它的值未定義 Java Virtual Machine Stacks(虛擬機器棧或者“C stacks(C 棧)”): 它隨執行緒的建立而建立,它主要用來儲存棧幀, 棧幀主要用來儲存區域性變數、並在方法呼叫和返回結果中起作用,棧幀可以被分配在堆上,它的記憶體空間是不需要連續的。 棧的大小可以人為設定。 當計算的棧空間大於實際的棧空間的時候 會丟擲StackOverflowError。 當棧需要進行擴容的時候,所剩的記憶體空間不滿足擴容所需的大小的時候, 或者記憶體不足以為新執行緒建立棧,會丟擲OutOfMemoryError。 Heap(堆): 堆是執行緒共享的資料區域、它是執行時資料區、分配所有實 例物件記憶體和陣列的記憶體。 堆在虛擬機器啟動的時候建立、堆的記憶體空間有垃圾收集器管理 (垃圾收集器型別可以有程式設計師來指定、選擇合適的收集器) 。堆的記憶體也可以不連續。堆上的物件永遠不會顯示的釋放、 即使呼叫了System.gc()方法也不一定會進行垃圾回收。 程式設計師可以指定堆的初始大小、最大值和最小值。 如果計算所需要的堆記憶體+已用堆記憶體超過堆的最大記憶體、則 會丟擲OutOfMemoryError。 Method Area(方法區): 方法區屬於執行緒共享的區域,它用來儲存虛擬機器載入的類資訊、常量等。虛擬機器規範認為它在邏輯上面是堆的一部分。但是可以不在方法區上面進行垃圾收集。它上面的物件屬於永遠不會被回收的。 它的大小同樣可以由偉大的程式設計師來指定。 當需要載入的類資訊的記憶體大於可用的方法區的記憶體時候, 他會丟擲OutOfMemoryError。 Run-Time Constant Pool(執行時常量池): 執行時常量池是從方法區中分配的。當虛擬機器構建類和介面時 將為類和介面建立執行時常量池。 在建立類或介面時,如果執行時常量池的構造需要的記憶體比Java虛擬機器的方法區域中可用的記憶體多,則會丟擲一個OutOfMemoryError。 Native Method Stacks(本地方法棧): 本地方法棧和虛擬機器棧作用差不多、只不過一個用來執行native方法、一個用來執行外部方法。 以上就是虛擬機器的記憶體區劃分及其大致作用。