對象的創(chuàng)建
init方法包括構造方法和初始化塊
創(chuàng)建對象的方式:new 序列化 克隆 反射
給對象分配內(nèi)存
1.指針碰撞
指針慢慢的往右邊移動,逐步分配石咬,如果多線程下揩悄,沒有做同步策略,會使一個區(qū)域被兩個線程同時使用鬼悠,導致指針碰撞删性。
2.空間列表
需要一個列表保存:A:0x000001,即為專門記錄數(shù)據(jù)的列表為空間列表
線程安全問題
1.線程同步(基本不用)
2.本地線程分配緩存
T1焕窝、T2蹬挺、T3三個代表線程,以及為每個線程分配的空間它掂,某個線程只會在其空間下分配內(nèi)存巴帮。
對象的結構
object的hash值就是mark word中的哈希值。
類型指針表示方法區(qū)的類的原信息虐秋,對象其實以類信息為模版生成的一個實例榕茧。
垃圾回收
1.如何判斷對象為垃圾對象
引用計數(shù)法(不能解決對象相互應用)
可達性算法( 根集合:(1). 虛擬機棧(棧幀中的局部變量區(qū),也叫做局部變量表)中引用的對象客给。(2). 方法區(qū)中的類靜態(tài)屬性引用的對象用押。(3). 方法區(qū)中常量引用的對象。(4). 本地方法棧中JNI(Native方法)引用的對象 )
2.垃圾回收算法
復制算法(jvm新生代回收)
它開始時把堆分成 一個對象 面和多個空閑面靶剑, 程序從對象面為對象分配空間蜻拨,當對象滿了,基于copying算法的垃圾 收集就從根集合(GC Roots)中掃描活動對象桩引,并將每個 活動對象復制到空閑面(使得活動對象所占的內(nèi)存之間沒有空閑洞)缎讼,這樣空閑面變成了對象面,原來的對象面變成了空閑面坑匠,程序會在新的對象面中分配內(nèi)存血崭。
標記清除(jvm老年代回收)
標記-清除算法采用從根集合(GC Roots)進行掃描,對存活的對象進行標記,標記完畢后功氨,再掃描整個空間中未被標記的對象序苏,進行回收,標記-清除算法不需要進行對象的移動捷凄,只需對不存活的對象進行處理忱详,在存活對象比較多的情況下極為高效,但由于標記-清除算法直接回收不存活的對象跺涤,因此會造成內(nèi)存碎片匈睁。
標記壓縮(jvm老年代回收)
標記-整理算法采用標記-清除算法一樣的方式進行對象的標記,但在清除時不同桶错,在回收不存活的對象占用的空間后航唆,會將所有的存活對象往左端空閑空間移動,并更新對應的指針院刁。標記-整理算法是在標記-清除算法的基礎上糯钙,又進行了對象的移動,因此成本更高退腥,但是卻解決了內(nèi)存碎片的問題任岸。
分代收集算法
1.Serial收集器(新生代,復制算法)
單線程狡刘,在進行垃圾收集時必須暫停其他所有的工作線程享潜,基本不用了。
2.ParNew收集器(新生代嗅蔬,復制算法)
Serial收集器的多線程版本剑按,除了Serial收集器外,目前只有它能與CMS收集器配合工作澜术。
3.Parallel Scavenge收集器(“吞吐量優(yōu)先”收集器)(新生代艺蝴,復制算法)
CMS等收集器的關注點是盡可能縮短垃圾收集時用戶線程的停頓時間,而Parallel Scavenge收集器的目的則是達到一個可控制的吞吐量(Throughput)
-XX:MaxGCPauseMillis 控制最大垃圾收集停頓時間(新生代調(diào)的小瘪板,吞吐量跟著小吴趴,垃圾收集時間就短,停頓就形昱省)
-XX:GCTimeRatio 直接設置吞吐量大小,0<x<100 的整數(shù)厢拭,允許的最大GC時間=1/(1+x)
-XX:+UseAdaptiveSizePolicy 一個開關參數(shù)兰英,開啟GC自適應調(diào)節(jié)策略(GC Ergonomics),將內(nèi)存管理的調(diào)優(yōu)任務(新生代大小-Xmn、Eden與Survivor區(qū)的比例-XX:SurvivorRatio供鸠、晉升老年代對象年齡-XX: PretenureSizeThreshold 畦贸、等細節(jié)參數(shù))交給虛擬機完成。這是Parallel Scavenge收集器與ParNew收集器的一個重要區(qū)別,另一個是吞吐量
4.Serial Old收集器(老年代薄坏,標記整理算法)
在JDK1.5及之前的版本中與Parallel Scavenge收集器搭配使用趋厉;作為CMS 收集器的后備預案,在并發(fā)收集發(fā)生Concurrent Mode Failure的時候使用胶坠。
5.Parallel Old收集器(老年代君账,標記整理算法)
Parallel Scavenge收集器的老年代版本,多線程沈善。在注重吞吐量及CPU資源敏感的場合乡数,都可以優(yōu)先考慮Parallel Scavenge+Parallel Old收集器
6.CMS收集器(Concurrent Mark Sweep,標記清除)
它是一種以獲取最短回收停頓時間為目標的收集器闻牡。
優(yōu)點:并發(fā)收集净赴,低停頓。
互聯(lián)網(wǎng)站或B/S系統(tǒng)的服務端等應用尤其重視服務的響應速度罩润,希望系統(tǒng)停頓時間最短玖翅,以給用戶帶來較好的體驗,CMS收集器就非常符合這類應用的需求割以。
注意點:
1.對CPU資源非常敏感金度,CMS默認的回收線程數(shù): (CPU數(shù)量+3)/4
2.無法處理浮動垃圾(并發(fā)清理階段用戶程序運行產(chǎn)生的垃圾過了標記階段所以無法在本次收集中清理掉,稱為浮動垃圾)拳球,若老年代增長的不是很快审姓,可以適當調(diào)高參數(shù)-XX:CMSInitiatingOccupancyFraction 提高觸發(fā)百分比,但調(diào)得太高會容易導致“Concurrent Mode Failure”失敗祝峻。
3.基于“標記-清除”算法會產(chǎn)生大量空間碎片魔吐。提供開關參數(shù)-XX:+UseCMSCompactAtFullCollection 用于在“ 享受”完Full GC服務之后進行碎片整理過程,內(nèi)存整理的過程是無法并發(fā)的莱找。但是停頓時間會變長酬姆。
4.-XX:CMSFullGCsBeforeCompation 設置在執(zhí)行多少次不壓縮的Full GC后,跟來來一次帶壓縮的奥溺。
7.G1收集器(Garbage First辞色,標記整理)
與CMS相比有兩個顯著改進:
基于“標記-整理”算法實現(xiàn)收集器
非常精確地控制停頓
之前的收集器進行收集的范圍都是整個新生代或老年代,而G1將整個Java堆(包括新生代浮定、老年代)劃分為多個大小固定的獨立區(qū)域(Region)相满,并且跟蹤這些區(qū)域里面的垃圾堆積程度,在后臺維護一個優(yōu)先列表桦卒,每次根據(jù)允許的收集時間立美,優(yōu)先回收垃圾最多的區(qū)域(這就是Garbage First名稱的由來)。區(qū)域劃分方灾、有優(yōu)先級的區(qū)域回收建蹄,保證了G1收集器在有限的時間內(nèi)可以獲得最高的收集效率碌更。
3.內(nèi)存分配策略
優(yōu)先分配eden區(qū)
大對象直接分配到老年代 -XX:PretentenureSizeThreshold
長期存活的對象分配到老年代-XX:MaxTennuringThreshold=15
空間分配擔保-XX:HandlePromotionFailure(檢查老年代最大可用連續(xù)空間是否大于歷次晉升老年代對象的平均大小)
空間擔保和大對象區(qū)別洞慎?
空間擔保是先到eden分配失敗再到老年代痛单,大對象是直接到老年代
動態(tài)對象年齡-XX:TargetSurvivorRatio(如果在survivor空間中相同年齡大小的對象的總和大于survivor的一半,年齡大于或等于該年齡的對象可以直接進入老年代)
逃逸分析和棧上分配
1.對象有沒有出方法的范圍劲腿,如果出了就是逃逸
2.棧上分配是將沒有逃逸的對象進行棧的內(nèi)存分配