java併發與GC

一、synchronizedjava

所重入場景:算法

繼承關係的類,子類調用父類的方法----------線程安全安全

帶有synchronized關鍵字的方法互相調用----------線程安全併發

二、volatilejvm

做用:是變量在多個線程中可見,當改變變量值時(注意,改變的是主內存的值),每一個線程的工做內存仍是原先的值;性能

強制線程到主內存(共享內存)中去讀,而不是去線程的私有內存中去讀,從而實現多個線程中可見。優化

注意:此關鍵沒有原子性,只有可見性,不能替代synchronized關鍵字的同步性spa

三、Atomic...線程

具備原子性,有boolean、Integer類型等;可是使用次關鍵字不能保證屢次操做的原子性,只能保證此方法的原子性orm

四、線程之間的通訊

使用wait和noyify方法實現線程之間的通訊,兩個方法都是Object的方法

wait和notify必須配合synchronized關鍵字使用,wait方法釋放鎖,notify方法不釋放鎖

五、java堆

有新生代和老年代

新生代:ende區、s0區和s1區(或者form區和to區)

ende區存放新生(第一次建立)的對象,每次發生GC,對象的年齡都會增大,這是對象會進入s0或者s1區,默認當

對象年齡滿15以後,若對象還繼續被引用,則會分配到老年代,s0和s1區大小相等而且角色能夠相互轉換

六、垃圾收集算法

引用計數算法:在對象被引用時計數器加1,而引用失去計數器減1;缺點,沒法處理對象被循環引用的狀況,而且每次進行加減操做比較浪費性能;

標記清除法:顧名思義,就是標記被引用的對象和清除全部未被標記的引用對象;缺點,會產生大量的空間碎片,浪費空間;

複製算法:主要用於新生代,對象存放在s0或者s1區,每次只會使用一塊區域,在垃圾回收時,將存活的對象(未進入老年代的對象)複製到s1或者s0區,而後清空s0或者s1區;

標記壓縮法:在標記清除法基礎之上作了優化,主要解決的空間碎片的問題;把存活對象壓縮到內存的一端,而後進行垃圾清理(jvm中老年代的GC就是使用的標記壓縮法);

七、分區算法

把內存劃分爲N個區域,每一個區域均可以獨立使用,解決了GC時候掃描整塊內存所消耗的性能,只須要清理某塊區域;

八、TLAB區(Thread Local Allocation Buffer)

當產生一個對象過大的時候,會直接把該對象放入到老年代(還有一種是對象年齡大於15時分配到老年代),但要注意優先分配到TLAB區;
每一個線程都有一塊TLAB(Thread Local Allocation Buffer)區,該線程獨享的工做區,是爲了加速對象分配而產生的
TLAB區是邏輯概念(其實仍是Eden區分配給線程的)
 
 
本文主要簡單介紹一下jvm與併發,初寫博客,若發現有錯誤請及時指正,謝謝。
相關文章
相關標籤/搜索