學習虛擬機器(jvm)必須知道的東西
我一共寫了兩篇部落格,這一篇是為了讓大家頭腦清楚,哪些重要,如果誰有不懂得
https://blog.csdn.net/weixin_40078053/article/details/80546846
這是我的另一篇部落格,對虛擬機器有詳細介紹,當然啦,滿滿全是乾貨,總結,否則看虛擬機器書有磚頭那麼厚,看了後面的的忘了前面的。
一、執行時資料區域
執行緒隔離, 執行緒共享,
方法區(執行時常量池)、堆、虛擬機器棧、本地方法棧、程式計數器
直接記憶體
二、hotspot虛擬機器物件
2.1 物件的建立
1.檢查 -->2.分配記憶體 (理解:指標碰撞,空閒列表)-->3. Init
2.2 物件的記憶體佈局
知道:3塊區域:物件頭、例項資料和對齊填充
2.2 物件的訪問定位
1、使用控制代碼訪問 2、使用直接指標訪問三、OutOfMemoryError(棧寬) 異常和StackOverflowError(棧深) 3.1 Java堆溢位 3.2 虛擬機器棧和本地方法棧溢位 3.3 方法區和執行時常量池溢位
四、垃圾收集
1.判斷物件存活
4.1.1 引用計數器法
4.1.2 可達性分析演算法
2.引用
強引用,軟引用,弱引用,虛引用
3.Finalize方法(自救)
4.3.1 回收方法區
廢棄常量和無用的類
4.4.1 標記—清除演算法(mark-sweep)
4.4.2 複製演算法(copying)
4.4.3 標記整理演算法(mark-compact)
4.4.4 分代收集演算法
5.垃圾收集器
Serial收集器,ParNew收集器,Parallel Scavenge(新生收集器),Serial Old 收集器,Parallel Old 收集器,CMS收集器(1.初始標記2.併發標記3.重新標記4.併發清除),G1收集器(初始標記,併發標記,最終標記,篩選回收)。6.記憶體分配與回收策略
MinorGC:清理新生代
MajorGC:清理老年代
FullGC:清理整個堆空間
4.6.1 物件優先在Eden分配
4.6.2 大物件直接進入老年代
4.6.3長期存活的物件將進入老年代
4.6.4動態物件年齡判定
4.6.4 空間分配擔保
五、虛擬機器類載入機制
1.需要知道虛擬機器規範規定有且只有5種情況必須立即對類進行初始化和不會導致初始化的情況。
2.類在載入進入記憶體的宣告週期:載入、驗證、準備、解析、初始化、使用和解除安裝7個階段
5.3 類的載入器
啟動類載入器,擴充套件類載入器,系統類載入器
雙親委派模型:優先順序:呼叫父類優先這張圖很明白吧。
六、Java記憶體模型與執行緒
6.1記憶體間的互動操作
lock(鎖定),unlock(解鎖),unlock(解鎖),load(載入),use(使用),assign(賦值),store(儲存),write(寫入)
6.2 重排序
重排序分成三種類型:1.編譯器優化的重排序, 2.指令級並行的重排序, 3.記憶體系統的重排序
6.3 對於volatile型變數的特殊規則(注意)
6.4 對於long和double型變數的特殊規則
6.5 原子性、可見性和有序性
6.6 先行發生原則:1.程式次序規則 2.管程鎖定規則 3.Volatile變數規則 4.執行緒啟動規則
5.執行緒終止規則 6.執行緒中斷規則 7.物件終結規則 8.傳遞性
6.7 Java執行緒排程:1.協同式排程 2.搶佔式排程
6.8 狀態轉換:
1.新建 2.執行 3.無限期等待 4.限期等待 5.阻塞 6.結束
七、執行緒安全
1、不可變 2、絕對執行緒安全 3、相對執行緒安全 4、執行緒相容 5、執行緒對立
7.1 執行緒安全的實現方法1.互斥同步 等待可中斷 , 公平鎖, 鎖繫結多個條件是指一個ReentrantLock物件可以同時繫結多個Condition物件 2.非阻塞同步
3.無同步方案(純程式碼) 7.2鎖優化
適應性自旋、鎖消除、鎖粗化、輕量級鎖和偏向鎖