1. 程式人生 > >程式執行時資料在JVM中的存放

程式執行時資料在JVM中的存放

1 JVM把管理的記憶體劃分不同區域,一些區域隨JVM啟動而存在,一些區域依賴於使用者執行緒的生命週期。
2 JVM管理的記憶體包括這幾個區域:

程式計數器,Java虛擬機器棧,本地方法棧。(執行緒單獨使用)

Java堆,方法區,常量池,直接記憶體。(執行緒共享)

程式計數器

Program counter register

  1. 告訴JVM(?)當前執行緒下一條指令的地址
  2. 如果執行Native方法,則為空
  3. 此區域沒有OutOfMemoryError,其他都有
 虛擬機器棧(JVM Stack)
  1. 為JVM使用的java 位元組碼服務
  2. 方法在執行的時候建立一個stack frame 入棧,執行完後出。
  3. stack frame儲存了局部變量表,操作棧,動態連結,方法出口等。
  4. 區域性變量表的記憶體空間在編譯時完成,執行時不會變化。
  5. 如果請求的棧大於允許的,stackoverflowerror.
  6. 如果JVM Stack動態擴充套件時,申請不到了,outofmemoryerror
本地方法棧(Native Method Stack)
  1. 為JVM使用的native method服務
  2. 也會丟擲outofmemoryerror和stackoverflowerror
java heap堆
  1. 所有執行緒共享,jvm啟動時建立
  2. 存放物件例項
  3. GC管理的主要區域
  4. -Xms -Xmx調節大小
  5. 會丟擲outofmemoryerror
java method area 方法區
  1. 存放被jvm載入的類 常量 靜態變數 即時編譯的程式碼
  2. 可以叫永久代
  3. 記憶體回收的物件是常量池的回收和型別的解除安裝。
  4. 方法區無法滿足記憶體分配需求時,outofmemoryerror
  5. 包括執行時的常量池,儲存符號引用和直接引用(一部分常量在編譯時產生,如final String "abc",但是也可以動態產生,如intern()方法)
直接記憶體
  1. 不會受到java heap限制,但是受到實體記憶體和定址空間的限制
  2. 如果sum(各個區域記憶體)>實體記憶體,outofmemoryerror
  3. 可以提高效能,避免java heap 和 native heap中來回複製資料(NIO 類的使用)

參考:

https://my.oschina.net/OutOfMemory/blog/299525

http://www.tuicool.com/articles/6vQ3am

http://chenzhou123520.iteye.com/blog/1585224