1. 程式人生 > 實用技巧 >7-78 切割繩子 (5分)

7-78 切割繩子 (5分)

總覽

image-20201021222746282

JVM標準中的五個組成部分

  • 方法區
  • 程式計數器
  • 本地方法棧
  • 虛擬機器棧

JDK1.7的執行時資料區

image-20201021224100216

  • 永久代是方法區的實現
  • jdk1.6之前字串常量池在方法區
  • jdk1.7之後字串常量池被移動到堆區

JDK1.8的執行時資料區

image-20201021224342226

  • jdk1.8去掉了永久代
  • 引入了元資料區
  • Jdk1.7中的執行時常量池移動到元資料區
  • 元資料區存在於直接記憶體中

為什麼移除永久代

方法區大小難以設定,容易發生記憶體溢位。永久代存放著Class相關資訊,一般資訊在編譯期就能確定,但是如果在一些動態生成的Class的應用中,如:Spring中的動態代理,大量的JSP頁面或動態生成的JSP頁面,由於方法區在一開始就要分配好,因此難以確定大小,容易發生記憶體溢位。

GC複雜效率低,方法區存放元資料和各種常量,但是這些資料被類的例項所引用,導致垃圾回收非常困難.
促進HotSpot VM和JRockit VM融合,JRockit VM沒有方法區

什麼是元空間

元空間永久代類似都是對JVM規範中方法區的實現。區別在於元空間不在JVM虛擬機器中,因此元空間的空間受本地記憶體制約。

元空間特點

  • 每個載入器都有自己的空間
  • 不會單獨回收某個類
  • 元空間物件的位置是固定的
  • 如果發現某個載入器不在存活,則將整個空間回收

image-20201021232107384