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、垃圾收集器之間的關係
9、java內存模型JMM
-
指令重排序的知足條件:在單線程環境下不會影響程序返回的結果、存在數據依賴的不容許進行重排序(沒法經過happers-before推導出來的,均可以進行重排序)
-
happers-bofore八大原則:
-
volatile和synchronized的區別:
- 如何保證內存可見性
- 做用對象
- 可以知足的併發問題
- 線程是否阻塞
- 編譯器優化
-
cas的缺點:
- ABA問題
- 只能做用與一個共享變量
- 若循環時間長,則會過多消耗cpu,開銷大