下面這部分知識在面試中可能會用到,同時瞭解這些只有有助於我們寫出高併發的代碼;同時歡迎和我探討。
我只是簡單的列出部分知識和概念,詳細情況可以讀我放出的博客鏈接。
對象內存佈局
https://www.cnblogs.com/zhengbin/p/6490953.html
包括三部分:對象頭、實例數據和對齊填充
對象頭: 總共佔12個字節,前8個字節是mark world (0-4 4-8) ;哈希碼(HashCode)、GC 分代年齡、鎖狀態標誌、線程持有的鎖、偏向線程 ID、偏向時間戳、對象分代年齡
後4個字節,是指向class的指針;64位實際上佔用8字節,但是默認啓用指針壓縮;
12個字節不滿足8的倍數、對齊補充4個字節
逃逸分析 --編譯器JIT
https://blog.csdn.net/w372426096/article/details/80938788
同步關鍵字 synchonized
cas lock cmpxchg
https://www.cnblogs.com/ljl150/p/12514198.html
1、字節碼層面 monitorenter moniterexit
2、jvm執行過程中 偏向鎖(無鎖)----> 自旋鎖(cas) ----> 重量鎖(互斥信號)
自旋更新鎖記錄Lock Record採用cas方式;1.6以後加入自適應自旋鎖
3、彙編層(cpu指令)實現 lock cmpxchg
訪問大對象,超過64kb的,鎖總線,效率低;不然使用cpu的一致性實現、如MESI;
https://blog.csdn.net/qq_35642036/article/details/82801708 總線鎖、緩存是、MESI
重量鎖 涉及到內核態到用戶態的切換;鎖記錄指向互斥量 lock mutex
依賴於底層的操作系統的Mutex Lock;而操作系統實現線程之間的切換時需要從用戶態轉換到內核態,這個狀態之間的轉換需要相對比較長的時間,時間成本相對較高,這也是爲什麼早期的synchronized效率低的原因
wait/notify必須在同步代碼塊中執行,用於生成monitorenter 和 monitorexit指令
關鍵字Voliatile
1、線程可見性
2、指令重排序 ---cpu亂序執行
1、驗證代碼
2、DCL(雙重檢查問題)問題、半初始化對象、使用對象出現問題
指令重排原理:
1、voliatlie可見性
2、JVM層面內存屏障,相關規範
3、CPU層面lock、鎖總線(有相關指令操作,考慮一致性問題和同步一樣用鎖)
Java引用
http://blog.csdn.net/l540675759/article/details/73733763 參考博客
強引用 正常的new對象
軟引用 SoftReference 內存不足就回收;應用場景 緩存
和引用隊列一起使用,如果被回收會放到引用隊列,被感知
#舉例,除了虛引用都是類似的用法
SoftReference reference = new SoftReference(obj, queue);
弱引用 WeakReference 弱引用的對象擁有更短的生命週期,只要垃圾回收器掃描到它,不管內存空間充足與否,都會回收它的內存。
一次性場景:ThreadLocal場景;Spring transaction的connnection;
同樣可以和引用隊列一起使用
虛引用 PhantomReference;堆外內存標記方便回收 應用場景 堆外內存;NIO
必須和引用隊列關聯 :
當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會把這個虛引用加入到與之關聯的引用隊列中。
(1)單條引用路徑可及性判斷:
在這條路徑中,最弱的一個引用決定對象的可及性。
(2)多條引用路徑可及性判斷:
幾條路徑中,最強的一條的引用決定對象的可及性
ThreadLocal
https://www.jianshu.com/p/a1cd61fa22da
1、主線程 threadLocal、線程1使用threadLocal添加值,實際上添加到當前線程的ThreadLocal.ThreadLocalMap裏面;線程2亦如是;
2、ThreadLocal使用entry使用弱引用存放key(即ThreadLocal),使用弱引用,方便gc回收ThreadLocal對象,不然無法回收,內存泄漏;但是map中的value對象依然無法釋放,會有內存泄漏;使用後,記得reomve key不然會有內存泄漏,remove會將key值爲空的也刪掉
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
//ThreadLocal<?> key, Object value
應用場景:Spring transaction的connnection;;WeakHashMap
在Java集合中有一種特殊的Map類型即WeakHashMap,在這種Map中存放了鍵對象的弱引用,當一個鍵對象被垃圾回收器回收時,那麼相應的值對象的引用會從Map中刪除. WeakHashMap能夠節約儲存空間,可用來緩存那些非必須存在的數據. WeakHashMap的訪問操作這時候才進行對鍵對象的垃圾回收清理.