JAVA基礎知識複習-JVM篇

簡介

JVM(Java Virtual Machine)是運行Java字節碼的虛擬機,由一套字節碼指令集、一組程序寄存器、一個虛擬機棧、一個虛擬機堆、一個方法區和一個垃圾回收器構成。java

運行過程

.java(源文件)-> .class(字節碼文件) -> 機器碼redis

構成

類加載子系統加載.class文件,數據存入運行時數據區,即時編譯器(跨平臺)將.class文件編程成機器碼,機器碼經過本地接口庫調用操做系統本地方法庫執行程序 算法

類比物理機

具體地,在JVM中,線程引擎對標CPU,工做內存對標高速緩存,主存對主存。當多個處理器同時對Java主存進行操做的時候就會發生不一致現象。單應用下,這種不一致能夠由Java並併發包提供的方法解決。例如AtomicLong,底層是經過CAS(compareAndSwap)來實現線程的同步,是在一個死循環內不斷的嘗試修改目標的值,直到修改爲功。分佈式下則能夠經過redis等組件來完成。 編程

內存模型

線程共享區與JVM共存亡,線程私有區域與線程共存亡,堆外內存能夠避免Java堆和Native堆之間來回複製的性能開銷,在併發編程中被普遍應用。 緩存

組件概要

  • 程序計數器:線程私有,記錄實時字節碼指令地址,執行Native則爲空,惟一沒有Out Of Memory的區域
  • 棧:線程私有,每一個⽅法在執⾏時都會牀建立⼀個棧幀(Stack Frame)⽤於存儲局部變量表 、 操做數棧 、 動態連接 、 ⽅法出⼝等信息。每⼀個⽅法從調⽤直⾄執⾏結束,就對應着⼀個棧幀從虛擬機棧中⼊棧到出棧的過程
  • 本地方法區:線程私有,相似棧,區別是執行Native方法
  • 堆:線程共享,存放建立的對象和產生的數據
  • 方法區:線程共享,存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據,JDK1.8以後成爲元數據區,原方法區的常量池和靜態變量存在堆中,元數據區則在堆外內存!!!!!

常量池

#string pool中存的是引⽤值⽽不是具體的實例對象,具體的實例對象是在堆中開闢的⼀塊空間存放的
#在堆中會有⼀個」abc」實例,全局StringTable中存放着」abc」的⼀個引⽤值
String str1 = "abc";
String str2 = "abc";
#若是常量池沒有「abc」則⽣成兩個實例,⼀個是」abc」的實例對象,而且StringTable中存儲⼀個」abc」的引⽤值,還有⼀個是new出來的⼀個」abc」的實例對象
String str3 = new String("abc");
String str4 = str2.intern();
System.out.println(str1==str2);//true
System.out.println(str1==str3);//false
System.out.println(str1==str4);//true
複製代碼

垃圾回收

對象已死斷定⽅法

  • 引用計數法:對象添加一個引用,引用計數+1,反之-1,爲0則認爲能夠回收。存在循環引用問題
  • 可達性分析:以一系列GC Roots的點做爲起點向下搜索,當一個對象到任何一個GC Roots都沒有引用鏈則認爲能夠回收(兩次標記)。

垃圾回收算法

  • 複製算法:分爲兩個區域,只用一個區域,每次將存活的放入另外一個區域。內存浪費問題
  • 標記清除算法:效率低,內存碎片問題
  • 標記整理算法:標記清除的基礎上,將對象放在內存的一端
  • 分代收集算法
    • 新生代:複製算法/...
    • 老年代: 標記清除/標記整理/...

進入老年代的途徑

  • 複製算法S區放不下
  • 對象過大,XX:PretenureSizeThreshold設置,通常爲2KB~128KB
  • 存活時間太久,XX:MaxTenuringThreshold設置,默認15(15次GC仍然存活)

垃圾收集器

  • 新生代
    • Serial:單線程,複製算法,Client默認
    • ParNew:Serial多線程版(默認CPU等值線程數),Server默認
    • Parallel Scavenge:多線程,複製算法,吞吐量(GC時間/總時間)
  • 老年代
    • CMS:標記清除,初始標記和從新標記須要STW,其餘過程不須要,爲了實現最短垃圾回收停頓時間
    • Serial Old:單線程,標記整理,Client默認
    • Parallel Old:多線程,標記整理
    • G1:標記整理,內存分區,經過優先級列表回收垃圾最多的區域,保證吞吐量的前提下實現最短垃圾回收停頓時間。

引用類型

  • 強引⽤
    • 相似於 Object obj = new Object(); 建立的,只要強引⽤在就不回收
  • 軟引⽤
    • SoftReference 類實現軟引⽤。在系統要發⽣內存溢出異常以前,將會把這些對象列進回收範圍之中進⾏⼆次回收
  • 弱引⽤
    • WeakReference 類實現弱引⽤。對象只能⽣存到下⼀次垃圾收集以前。在垃圾收集器⼯做時,⽆論內存是否⾜夠都會回收掉只被弱引⽤關聯的對象
  • 虛引⽤
    • PhantomReference 類實現虛引⽤。⽆法經過虛引⽤獲取⼀個對象的實例,爲⼀個對象設置虛引⽤關聯的惟⼀⽬的就是能在這個對象被收集器回收時收到⼀個系統通知

網絡編程模型

類加載機制

監控

相關文章
相關標籤/搜索