JVM相關

 

 

 

1、ClassLoader的做用

 

  咱們都知道java程序寫好之後是以.java(文本文件)的文件存在磁盤上,而後,咱們經過(bin/javac.exe)編譯命令把.java文件編譯成.class文件(字節碼文件),並存在磁盤上。可是程序要運行,首先必定要把.class文件加載到JVM內存中才能使用的,咱們所講的classLoader,就是負責把磁盤上的.class文件加載到JVM內存中java

2、ClassLoader種類

  •   BootStrapClassLoader:C++編寫,加載核心庫java.*

  •   ExtClassLoader:java編程,加載擴展庫javax.* 

  •   AppClassLoader: java編寫,加載程序所在的目錄

  •        自定義ClassLoader:java編寫,定製化加載  加載的地方不限,能夠是

3、爲何要使用雙親委派機制去加載類

  •   避免多份一樣字節碼的加載

4、jvm內存模型

  

  1.程序計數器:

    • 當前線程所執行的字節碼行號指示器(邏輯)
    • 改變計數器的指能夠選取下一條須要執行的字節碼指令
    • 和線程是一對一的關係,「線程私有」
    • 對java方法計數,若是是native方法則計數器指爲Undefined
    • 不會發生內存泄漏

  2.java虛擬機棧(Stack)

    • java方法執行的內存模型  
        • 局部變量表:包含方法執行過程當中的全部變量
        • 操做數棧:入棧、出棧、複製、交換、產生消費變量
        •  

    • 包含多個棧幀

  3.本地方法棧:與虛擬機類類似,主要做用於標註了native的方法

 

  5.java堆:對象實例的分配區域,GC的主要區域

5、java內存模型中堆和棧的區別

  • 管理方式:棧自動釋放,堆須要GC
  • 空間大小: 棧比堆小
  • 碎片相關: 棧產生的碎片遠小於堆
  • 分配方式:棧支持動態和靜態分配,而堆只支持動態分配
  • 效率:棧的效率高於堆

6、能夠做爲GC ROOT的對象

  • 虛擬機棧中的對象(棧幀中的本地變量表)
  • 方法區中的經常使用引用的對象
  • 方法區中的類靜態屬性引用的對象
  • 本地方法棧中jni引用的對象
  • 活躍線程的引用對象

7、Safepoint 

  • 分析過程當中對象的引用關係不會發生變化的點
  • 產生Safepoint的地方:方法調用;循環跳轉;異常跳轉等
  • 安全點數量須要適中

 8、垃圾收集器之間的關係

  

  • Serail收集器(-XX:+UseSerialGC ,複製算法)

    • 單線程收集,進行垃圾收集時,必須暫停全部的工做線程
    • 簡單高效,Client模式下默認的年輕帶收集器
  • ParNew收集器(-XX:+UseParNewGC,複製算法)

    • 多線程收集,其他的行爲、特色和serail收集器同樣
    • 單核執行效率不如Serail,在多核執行下才有優點
  • Parallel Scavenge收集器(-XX: +UseParallelGC ,複製算法)算法

    • 比起關注用戶的線程停頓時間,更關注系統的吞吐量
    • 多核模式下才具備優點
  • Serial Old收集器(-XX:+UseSerialOldGC, 標記-整理算法)
    • 單線程收集,必須暫停全部的工做線程
    • 簡單高效,Client模式下默認的收集器
  • Parallel Old收集器(-XX:UseParallelOldGC, 標記-整理算法)
    • 多線程收集,吞吐量優先
  • CMS收集器(-XX:UseConcMarkSweepGC, 標記-清除算法)
    • 初始標記:
    • 併發標記:
    • 併發預清理:
    • 可中斷的併發預清理:
    • 最終標記:
    • 併發清理:
    • 併發重置:
  • G1收集器(-XX:+UseG1GC,複製+標記-整理算法)
    • 併發和並行的
    • 分代收集的
    • 空間整合,不會產生內存碎片的問題
    • 可預測的停頓
    • 將整個java堆內存劃分紅大小相等的Region,年輕代和老年代再也不是物理隔離
    •  

9、java內存模型JMM

  1. 指令重排序的知足條件:在單線程環境下不會影響程序返回的結果、存在數據依賴的不容許進行重排序(沒法經過happers-before推導出來的,均可以進行重排序)

  2. happers-bofore八大原則:

  3. volatile和synchronized的區別:

    1. 如何保證內存可見性
    2. 做用對象
    3. 可以知足的併發問題
    4. 線程是否阻塞
    5. 編譯器優化
  4. cas的缺點:

    1. ABA問題
    2. 只能做用與一個共享變量
    3. 若循環時間長,則會過多消耗cpu,開銷大
相關文章
相關標籤/搜索