深入理解java虛擬機學習—運行時數據區域

參考資料:《深入理解java虛擬機》JVM高級特性與最佳實踐第二版  周志明


java虛擬機運行時數據區域如下圖:


其中 紅色背景區域代表的是線程共享的內存區,而藍色背景區域代表的是線程私有的內存區。

一、 線程共享的內存區域

    1. 堆 Heap

        這個區域是我們用到最多的內存區域,該區域在虛擬機啓動時創建,對象實例以及數組(直觀點就是使用new產生的)都在這個堆上分配,我們可以通過 -Xmx(堆最大可用內存)和 -Xms(堆初始分配內存)來控制,如果在堆中沒有內存可以用來分配實例,同時堆也無法再擴展時,會拋出 OutOfMemoryError異常。

    2. 方法區

        這個區域用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據,該區域包括了一個 運行時常量池區域,運行時常量池用於存放編譯期生成的各種字面量(literal)和符號引用,這部分當內存不足時,會拋出 OutOfMemoryError異常。


二、線程私有的內存區域

    1. 程序計數器

        這是一塊較小的內存空間,可以看做是當前線程所執行的字節碼的行號指示器,每條線程都需要有一個獨立的程序計數器,各個線程之間計數器互不影響。當線程執行的是一個java方法時,計數器記錄的是虛擬機字節碼指令的地址;當線程執行的是Native方法時,這個計數器值爲空。 此內存區域是唯一一個在java虛擬機規範中沒有規定任何OutOfMemoryError情況的區域。

    2. 虛擬機棧

        每個方法在執行時都會創建一個棧幀,一個方法對應一個棧幀。棧幀用來存儲局部變量表、操作數棧等(比如在一個方法裏定義的局部變量就存在這裏),每一個方法從調用直到執行完成的過程,就是這個方法對應的棧幀在虛擬機棧入棧到出棧的過程。如果線程請求的棧深度大於虛擬機所允許的深度,將拋出StackOverflowError異常;如果虛擬機棧可以動態擴展,那麼在擴展時如果無法申請到足夠的內存,就會拋出 OutOfMemoryError異常。

    3. 本地方法棧

        本地方法棧發揮的作用於虛擬機棧類似,只不過虛擬機棧爲虛擬機執行java方法服務,而本地方法棧爲虛擬機使用到的Native方法服務,本地方法棧也會拋出StackOverflowError和OutOfMemoryError異常。

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