JVM從入門到入門!

最近的學習狀態超級差,也沒有怎麼寫博客,知識點也都忘得差很少了。該複習一波了!java

垃圾回收

1、引用

  • 強引用:只要引用還在,垃圾回收就不會回收引用對象
  • 軟引用:系統在發生內存溢出異常以前,會把這些對象列進回收範圍中進行二次回收,若是第二次回收尚未足夠的內存,這時會拋出內存溢出異常
  • 弱引用:只能生存到下一次垃圾回收以前
  • 虛引用:對象被垃圾回收器回收時收到一個系統通知

2、內存

  • 棧(stack):存放基本數據類型,對象的引用
  • 堆(heap):存放new的對象
  • 靜態區:存放字面量(10,‘abc’)和靜態常量

圖示算法

例子:緩存

String str = new String("hello");

上面的語句中變量str放在棧上,用new建立出來的字符串對象放在堆上,而"hello"這個字面量放在靜態區。學習

3、垃圾回收算法

標記—清除算法:在二次標記後完成統一回收,在回收以後會產生大量不連續內存碎片,若是要建立一個較大內存的對象,沒有足夠連續內存,會再次觸發GCspa

標記—整理算法:清除的時候會把全部存活的對象向一端移動(歸整),而後清除code

複製算法:分爲大小相同的倆部份內存,每次只用一部分,當這部分的內存快滿的時候,把沒有被回收的對象移到另外一部分,把這部分清空(效率低)對象

分代收集算法:根據對象存活週期的不一樣,分爲新生代和老年代,新生代採用複製算法,老年代採用標記清除或標記整理blog

在新生代觸發的GC稱爲Minor GC;在老年代觸發的GC稱爲Full GC內存

類加載

1、概念

類加載:將class文件加載到JVM中。類的加載是動態的,它不會一次性把全部類都加載到虛擬機,而是把一些必要的類先加載到虛擬機,而後用到哪些再加載,這樣節省了內存開銷。字符串

2、類的加載時機

  • 建立類的實例(new)
  • 訪問類的靜態變量,或爲類的靜態變量賦值,調用類的靜態方法
  • 反射的方式
  • 初始化某個類的子類,其父類也會被初始化
  • 標明某個類爲啓動類,執行main方法

 3、類加載器

class文件是經過類加載器加載到JVM中的

分類

  • 啓動類加載器(Bootstrap  ClassLoader):加載系統主要文件
  • 擴展類加載器(ExtClassLoader):
  • 應用類加載器(AppClassLoader)
  • 自定義類加載器(User ClassLoader)  

類加載器在成功加載某個類以後,會把獲得的java.lang.Class類的實例緩存起來,這樣下次再加載這個類時候就能夠直接使用實例,而不會再次加載。

 

雙親委託模型:一個類加載器收到類加載的請求不會本身去嘗試加載這個類,而是交給它父類,依次向上。這樣,防止內存出現多份一樣的字節碼

類初始化

類初始分爲類的加載,鏈接,初始化。

加載:查找並加載類的二進制數據,在java堆中建立一個java.lang.Class對象

鏈接:包括驗證,準備,解析

初始化:爲類的靜態變量賦初始值

先這麼多,敬請期待「從入門到放棄」