JVM運行時數據區

程序計數器(pc計數器)

    線程私有,唯一一個沒有OutOfMemoryError。JVM的多線程是通過線程輪流切換並分配處理器執行時間來實現的,爲了線程切換後能恢復到正確的執行位置,每個線程都有一個獨立的pc計數器。

    線程正執行一個java方法,則記錄的是正執行的字節碼指令的地址;native方法,則此時計數器值爲空。

虛擬機棧(VM Stack)

    線程私有,描述的是java方法執行的內存模型,每個方法在執行的同時創建一個棧幀(Stack Frame)用於存儲 局部變量表、操作數棧、動態鏈接、方法出口 等信息。方法調用直至執行完成的過程,對應一個棧幀入棧到出棧的過程。

    局部變量表所需空間在編譯期間就確定,方法運行時不會改變。存放了方法中的 基本類型、對象引用和returnAddress類型(指向一條字節碼指令的地址)。其中64位長度的long和double會佔用2個局部變量空間。

    若是不可擴展的,如果線程請求的棧深度大於虛擬機所允許,則拋StackOverflowError

    若是可擴展的,申請不到足夠的內存,則拋OutOfMemoryError。

本地方法棧(Native Method Stack)

    與虛擬機棧很相似,虛擬機棧面向java方法,這個面向native方法。同樣是那兩種異常。

java堆(Java Heap)

    線程共享。虛擬機啓動時創建,用於存放對象實例和數組,物理上空間可以不連續,可以實現成固定大小的,也可以是可擴展的,是垃圾收集器管理的主要區域。沒有內存了就拋OutOfMemoryError。

    數組是引用類型,它的引用在棧裏的對應方法的局部變量表中。

方法區(Method Area)

    線程共享。存放JVM加載的 類信息、常量、靜態變量、即時編譯器編譯後的代碼 等數據。物理空間可不連續,可固定大小,也可是可擴展的,內存回收主要針對常量池的回收和類型的卸載。OutOfMemoryError。

    運行時常量池(Runtime Constant Pool)是方法區一部分,用於存放class文件中的字面量和符號引用,還有翻譯出的直接引用。具備動態性,運行時也可以放入新的常量,常用的是String類的intern()方法。



直接內存(Direct Memory)

    並不是運行時數據區的一部分。

    OutOfMemoryError

    JDK1.4中加入了NIO類,引入了一種基於通道與緩衝區的I/O方式,可以使用Native庫函數直接分配堆外內存,然後通過一個存儲在java堆中的DirectByteBuffer對象作爲這塊內存的引用進行操作。這樣能在一些場景中顯著提高性能,因爲避免的在java堆和Native堆中來回複製數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章