2. Java內存區域與內存溢出異常

1.運行時數據區域

image
圖1 Java虛擬機運行時數據區

1.1 程序計數器(Program Counter Register)

  • 1.程序計數器是一塊較小的內存空間,可以看作是當前線程所執行的字節碼的行號指示器。
  • 2.通過改變這個計數器的值來選取下一條需要執行的字節碼的執行。分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器。
  • 3.這個區域是jvm規範中沒有規定任何OutOfMemoryError情況的區域

1.2 虛擬機棧(VM Stack)

  • 1.虛擬機棧也就是我們平常所稱的棧內存,它爲java方法服務,每個方法在執行的時候都會創建一個棧幀,用於存儲局部變量表、操作數棧、動態鏈接和方法出口等信息。
  • 2.虛擬機棧是線程私有的,它的生命週期與線程相同。
  • 3.局部變量表裏存儲的是基本數據類型、returnAddress類型(指向一條字節碼指令的地址)和對象引用,這個對象引用有可能是指向對象起始地址的一個指針,也有可能是代表對象的句柄或者與對象相關聯的位置。局部變量所需的內存空間在編譯器間確定
  • 4.操作數棧的作用主要用來存儲運算結果以及運算的操作數,它不同於局部變量表通過索引來訪問,而是壓棧和出棧的方式
  • 5.每個棧幀都包含一個指向運行時常量池中該棧幀所屬方法的引用,持有這個引用是爲了支持方法調用過程中的動態連接.動態鏈接就是將常量池中的符號引用在運行期轉化爲直接引用。

1.3 本地方法棧(Native Method Stack)

與虛擬機棧所發揮的作用相似,爲虛擬機使用到的native方法服務。

1.4 方法區(Method Area)

  • 1.是各個線程共享的內存區域,用於存儲已被虛擬機加載的類信息、變量、靜態變量、即時編譯器編譯後的代碼等
  • 2.有時候也成爲永久代(Permanent Generation),在該區內很少發生垃圾回收,但是並不代表不發生GC,在這裏進行的GC主要是對方法區裏的常量池和對類型的卸載
  • 3.方法區中存在常量池,用於存放編譯器生成的各種字變量和符號引用

1.5 堆(Heap)

java堆是所有線程所共享的一塊內存,在虛擬機啓動時創建,幾乎所有的對象實例都在這裏創建,因此該區域經常發生垃圾回收操作。

Java堆還可以細分爲新生代和老年代,再細緻一點的有Eden空間,From Survivor空間、To Survivor空間等

蒐集了一些不錯的博文
參考博客:JVM調優總結
參考博客:深入理解JVM—JVM內存模型
參考博客:關於JVM內存模型的理解

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