1. 兩個(gè)對(duì)象的hashCode相同,則equals也一定為true陪汽,對(duì)嗎训唱?
不對(duì),答案見(jiàn)下面的代碼:
@Override
public int hashCode() {
return 1;
}
兩個(gè)對(duì)象equals為true挚冤,則hashCode也一定相同况增,對(duì)嗎?
這塊肯定是有爭(zhēng)議的训挡。面試的時(shí)候這樣答:如果按照官方設(shè)計(jì)要求來(lái)打代碼的話澳骤,hashcode一定相等。但是如果不按官方照設(shè)計(jì)要求澜薄、不重寫hashcode方法为肮,就會(huì)出現(xiàn)不相等的情況。
2. java線程池用過(guò)沒(méi)有表悬?
Executors提供了四種方法來(lái)創(chuàng)建線程池弥锄。
newFixedThreadPool() :創(chuàng)建固定大小的線程池。
newCachedThreadPool(): 創(chuàng)建無(wú)限大小的線程池蟆沫,線程池中線程數(shù)量不固定籽暇,可根據(jù)需求自動(dòng)更改。
newSingleThreadPool() : 創(chuàng)建單個(gè)線程池饭庞,線程池中只有一個(gè)線程戒悠。
newScheduledThreadPool() 創(chuàng)建固定大小的線程池,可以延遲或定時(shí)的執(zhí)行任務(wù)舟山。
手寫一個(gè):
public static void main(String[] args) {
ExecutorService threadPool = Executors.newCachedThreadPool();
threadPool.execute(() -> {
for (int i = 0; i< 20;i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
});
threadPool.shutdown();
}
線程池作用
限制線程個(gè)數(shù)绸狐,避免線程過(guò)多導(dǎo)致系統(tǒng)運(yùn)行緩慢或崩潰。
不需要頻繁的創(chuàng)建和銷毀累盗,節(jié)約資源寒矿、響應(yīng)更快。
3. Math.round(-2.5)等于多少若债?
不要認(rèn)為它是四舍五入!不要認(rèn)為它是四舍五入!不要認(rèn)為它是四舍五入!
口訣:+0.5后向下取整符相。所以結(jié)果是-2。
留個(gè)題,Math.round(-2.6)結(jié)果和Math.round(2.6)結(jié)果
4. 面向?qū)ο罅笤瓌t
單一職責(zé)原則——SRP
讓每個(gè)類只專心處理自己的方法啊终。
開(kāi)閉原則——OCP
軟件中的對(duì)象(類镜豹,模塊,函數(shù)等)應(yīng)該對(duì)于擴(kuò)展是開(kāi)放的蓝牲,但是對(duì)于修改是關(guān)閉的趟脂。
里式替換原則——LSP
子類可以去擴(kuò)展父類,但是不能改變父類原有的功能例衍。
依賴倒置原則——DIP
應(yīng)該通過(guò)調(diào)用接口或抽象類(比較高層)昔期,而不是調(diào)用實(shí)現(xiàn)類(細(xì)節(jié))。
接口隔離原則——ISP
把接口分成滿足依賴關(guān)系的最小接口肄渗,實(shí)現(xiàn)類中不能有不需要的方法镇眷。
迪米特原則——LOD
高內(nèi)聚,低耦合。
5. static和final區(qū)別
6. String s = "hello"和String s = new String("hello");區(qū)別
String s = new String("hello");可能創(chuàng)建兩個(gè)對(duì)象也可能創(chuàng)建一個(gè)對(duì)象翎嫡。如果常量池中有hello字符串常量的話欠动,則僅僅在堆中創(chuàng)建一個(gè)對(duì)象。如果常量池中沒(méi)有hello對(duì)象惑申,則堆上和常量池都需要?jiǎng)?chuàng)建具伍。
String s = "hello"這樣創(chuàng)建的對(duì)象,JVM會(huì)直接檢查字符串常量池是否已有"hello"字符串對(duì)象圈驼,如沒(méi)有人芽,就分配一個(gè)內(nèi)存存放"hello",如有了绩脆,則直接將字符串常量池中的地址返回給棧萤厅。(沒(méi)有new,沒(méi)有堆的操作)
7. 引用類型是占用幾個(gè)字節(jié)靴迫?
hotspot在64位平臺(tái)上惕味,占8個(gè)字節(jié),在32位平臺(tái)上占4個(gè)字節(jié)玉锌。
8. `(1<3)?"a":"b")+3+4`和`(1<3)?"a":"b")+(3+4)`區(qū)別
System.out.println(((1<3)?"a":"b")+3+4);
System.out.println(((1<3)?"a":"b")+(3+4));
控制臺(tái):
a34
a7
8.1 什么情況下,加號(hào)會(huì)變成字符串連接符
依據(jù)上面的例子來(lái)思考名挥。
9. java中的switch選擇結(jié)構(gòu)可以使用數(shù)據(jù)類型的數(shù)據(jù)(JDK1.8)
char
byte
short
int
Character
Byte
Short
Integer
String
enum
更好的記憶方法:
基本類型中,沒(méi)有boolean和浮點(diǎn)類型+長(zhǎng)類型long.相應(yīng)的包裝類型也沒(méi)有主守。
外加String和enum禀倔。
10. `4&5``4^5``4&10>>1`各等于多少
// 0100 & 0101 = 0100 = 4
System.out.println(4&5);
// 0100 ^ 0101 = 0001 = 1
System.out.println(4^5);
System.out.println(10>>1);
// 有疑問(wèn)參考下面的運(yùn)算符優(yōu)先級(jí)
System.out.println(4&10>>1);
4
1
5
4
`4|5`等于多少呢
答案:5
運(yùn)算符優(yōu)先級(jí)
11. 某些java類為什么要實(shí)現(xiàn)Serializable接口
為了網(wǎng)絡(luò)進(jìn)行傳輸或者持久化
什么是序列化
將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^(guò)程
除了實(shí)現(xiàn)Serializable接口還有什么序列化方式
Json序列化
FastJson序列化
ProtoBuff序列化
…
12. JVM垃圾處理方法
標(biāo)記-清除算法(老年代)
該算法分為“標(biāo)記”和“清除”兩個(gè)階段: 首先標(biāo)記出所有需要回收的對(duì)象(可達(dá)性分析), 在標(biāo)記完成后統(tǒng)一清理掉所有被標(biāo)記的對(duì)象.
該算法會(huì)有兩個(gè)問(wèn)題:
效率問(wèn)題厅须,標(biāo)記和清除效率不高弹砚。
空間問(wèn)題: 標(biāo)記清除后會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片, 空間碎片太多可能會(huì)導(dǎo)致在運(yùn)行過(guò)程中需要分配較大對(duì)象時(shí)無(wú)法找到足夠的連續(xù)內(nèi)存而不得不提前觸發(fā)另一次垃圾收集。
所以它一般用于"垃圾不太多的區(qū)域晾咪,比如老年代"涎才。
復(fù)制算法(新生代)
該算法的核心是將可用內(nèi)存按容量劃分為大小相等的兩塊, 每次只用其中一塊, 當(dāng)這一塊的內(nèi)存用完, 就將還存活的對(duì)象(非垃圾)復(fù)制到另外一塊上面, 然后把已使用過(guò)的內(nèi)存空間一次清理掉鞋既。
優(yōu)點(diǎn):不用考慮碎片問(wèn)題,方法簡(jiǎn)單高效。
缺點(diǎn):內(nèi)存浪費(fèi)嚴(yán)重涛救。
現(xiàn)代商用VM的新生代均采用復(fù)制算法,但由于新生代中的98%的對(duì)象都是生存周期極短的业扒,因此并不需完全按照1∶1的比例劃分新生代空間检吆,而是將新生代劃分為一塊較大的Eden區(qū)和兩塊較小的Survivor區(qū)(HotSpot默認(rèn)Eden和Survivor的大小比例為8∶1), 每次只用Eden和其中一塊Survivor。
當(dāng)發(fā)生MinorGC時(shí)程储,將Eden和Survivor中還存活著的對(duì)象一次性地拷貝到另外一塊Survivor上蹭沛, 最后清理掉Eden和剛才用過(guò)的Survivor的空間。當(dāng)Survivor空間不夠用(不足以保存尚存活的對(duì)象)時(shí)章鲤,需要依賴?yán)夏甏M(jìn)行空間分配擔(dān)保機(jī)制摊灭,這部分內(nèi)存直接進(jìn)入老年代。
復(fù)制算法的空間分配擔(dān)保:
在執(zhí)行Minor GC前, VM會(huì)首先檢查老年代是否有足夠的空間存放新生代尚存活對(duì)象, 由于新生代使用復(fù)制收集算法, 為了提升內(nèi)存利用率, 只使用了其中一個(gè)Survivor作為輪換備份, 因此當(dāng)出現(xiàn)大量對(duì)象在Minor GC后仍然存活的情況時(shí), 就需要老年代進(jìn)行分配擔(dān)保, 讓Survivor無(wú)法容納的對(duì)象直接進(jìn)入老年代, 但前提是老年代需要有足夠的空間容納這些存活對(duì)象.
但存活對(duì)象的大小在實(shí)際完成GC前是無(wú)法明確知道的, 因此Minor GC前, VM會(huì)先首先檢查老年代連續(xù)空間是否大于新生代對(duì)象總大小或歷次晉升的平均大小, 如果條件成立, 則進(jìn)行Minor GC, 否則進(jìn)行Full GC(讓老年代騰出更多空間).
然而取歷次晉升的對(duì)象的平均大小也是有一定風(fēng)險(xiǎn)的, 如果某次Minor GC存活后的對(duì)象突增,遠(yuǎn)遠(yuǎn)高于平均值的話,依然可能導(dǎo)致?lián)J?Handle Promotion Failure, 老年代也無(wú)法存放這些對(duì)象了), 此時(shí)就只好在失敗后重新發(fā)起一次Full GC(讓老年代騰出更多空間).
標(biāo)記-整理算法(老年代)
標(biāo)記清除算法會(huì)產(chǎn)生內(nèi)存碎片問(wèn)題, 而復(fù)制算法需要有額外的內(nèi)存擔(dān)卑芑玻空間, 于是針對(duì)老年代的特點(diǎn), 又有了標(biāo)記整理算法. 標(biāo)記整理算法的標(biāo)記過(guò)程與標(biāo)記清除算法相同, 但后續(xù)步驟不再對(duì)可回收對(duì)象直接清理, 而是讓所有存活的對(duì)象都向一端移動(dòng),然后清理掉端邊界以外的內(nèi)存.
13. 新生代帚呼、老年代、持久代都存儲(chǔ)哪些東西
新生代:
方法中new一個(gè)對(duì)象皱蹦,就會(huì)先進(jìn)入新生代煤杀。
老年代:
新生代中經(jīng)歷了N次垃圾回收仍然存活的對(duì)象就會(huì)被放到老年代中。
大對(duì)象一般直接放入老年代沪哺。
當(dāng)Survivor空間不足沈自。需要老年代擔(dān)保一些空間,也會(huì)將對(duì)象放入老年代辜妓。
永久代:
指的就是方法區(qū)枯途。
14. 可達(dá)性算法中,哪些對(duì)象可作為GC Roots對(duì)象籍滴。
虛擬機(jī)棧中引用的對(duì)象
方法區(qū)靜態(tài)成員引用的對(duì)象
方法區(qū)常量引用對(duì)象
本地方法棧JNI引用的對(duì)象
15. 什么時(shí)候進(jìn)行MinGC和FullGC
MinGC:
當(dāng)Eden區(qū)滿時(shí),觸發(fā)Minor GC.
FullGC:
調(diào)用System.gc時(shí)酪夷,系統(tǒng)建議執(zhí)行Full GC,但是不必然執(zhí)行
老年代空間不足
方法區(qū)空間不足
通過(guò)Minor GC后進(jìn)入老年代的平均大小大于老年代的剩余空間
堆中分配很大的對(duì)象异逐,而老年代沒(méi)有足夠的空間
16. 如何判定對(duì)象為垃圾對(duì)象
在堆里面存放著Java世界中幾乎所有的對(duì)象實(shí)例, 垃圾收集器在對(duì)堆進(jìn)行回收前, 第一件事就是判斷哪些對(duì)象已死(可回收).
引用計(jì)數(shù)法
在JDK1.2之前捶索,使用的是引用計(jì)數(shù)器算法。
在對(duì)象中添加一個(gè)引用計(jì)數(shù)器灰瞻,當(dāng)有地方引用這個(gè)對(duì)象的時(shí)候腥例,引用計(jì)數(shù)器的值就+1,當(dāng)引用失效的時(shí)候酝润,計(jì)數(shù)器的值就-1燎竖,當(dāng)引用計(jì)數(shù)器被減為零的時(shí)候,標(biāo)志著這個(gè)對(duì)象已經(jīng)沒(méi)有引用了要销,可以回收了构回!
問(wèn)題:如果在A類中調(diào)用B類的方法,B類中調(diào)用A類的方法,這樣當(dāng)其他所有的引用都消失了之后纤掸,A和B還有一個(gè)相互的引用脐供,也就是說(shuō)兩個(gè)對(duì)象的引用計(jì)數(shù)器各為1,而實(shí)際上這兩個(gè)對(duì)象都已經(jīng)沒(méi)有額外的引用借跪,已經(jīng)是垃圾了政己。但是該算法并不會(huì)計(jì)算出該類型的垃圾。
可達(dá)性分析法
在主流商用語(yǔ)言(如Java掏愁、C#)的主流實(shí)現(xiàn)中, 都是通過(guò)可達(dá)性分析算法來(lái)判定對(duì)象是否存活的: 通過(guò)一系列的稱為 GC Roots 的對(duì)象作為起點(diǎn), 然后向下搜索; 搜索所走過(guò)的路徑稱為引用鏈/Reference Chain, 當(dāng)一個(gè)對(duì)象到 GC Roots 沒(méi)有任何引用鏈相連時(shí), 即該對(duì)象不可達(dá), 也就說(shuō)明此對(duì)象是不可用的, 如下圖:雖然E和F相互關(guān)聯(lián)歇由, 但它們到GC Roots是不可達(dá)的, 因此也會(huì)被判定為可回收的對(duì)象。
注:?即使在可達(dá)性分析算法中不可達(dá)的對(duì)象, VM也并不是馬上對(duì)其回收, 因?yàn)橐嬲嬉粋€(gè)對(duì)象死亡, 至少要經(jīng)歷兩次標(biāo)記過(guò)程: 第一次是在可達(dá)性分析后發(fā)現(xiàn)沒(méi)有與GC Roots相連接的引用鏈, 第二次是GC對(duì)在F-Queue執(zhí)行隊(duì)列中的對(duì)象進(jìn)行的小規(guī)模標(biāo)記(對(duì)象需要覆蓋finalize()方法且沒(méi)被調(diào)用過(guò)).
17. 你能說(shuō)出來(lái)幾個(gè)垃圾收集器
Serial
Serial收集器是Hotspot運(yùn)行在Client模式下的默認(rèn)新生代收集器, 它在進(jìn)行垃圾收集時(shí)果港,會(huì)暫停所有的工作進(jìn)程沦泌,用一個(gè)線程去完成GC工作
特點(diǎn):簡(jiǎn)單高效,適合jvm管理內(nèi)存不大的情況(十兆到百兆)辛掠。
Parnew
ParNew收集器其實(shí)是Serial的多線程版本谢谦,回收策略完全一樣,但是他們又有著不同公浪。
我們說(shuō)了Parnew是多線程gc收集他宛,所以它配合多核心的cpu效果更好,如果是一個(gè)cpu欠气,他倆效果就差不多厅各。(可用-XX:ParallelGCThreads參數(shù)控制GC線程數(shù))
Cms
CMS(Concurrent Mark Sweep)收集器是一款具有劃時(shí)代意義的收集器, 一款真正意義上的并發(fā)收集器, 雖然現(xiàn)在已經(jīng)有了理論意義上表現(xiàn)更好的G1收集器, 但現(xiàn)在主流互聯(lián)網(wǎng)企業(yè)線上選用的仍是CMS(如Taobao),又稱多并發(fā)低暫停的收集器。
由他的英文組成可以看出预柒,它是基于標(biāo)記-清除算法實(shí)現(xiàn)的队塘。整個(gè)過(guò)程分4個(gè)步驟:
初始標(biāo)記(CMS initial mark):僅只標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對(duì)象, 速度很快
并發(fā)標(biāo)記(CMS concurrent mark: GC Roots Tracing過(guò)程)
重新標(biāo)記(CMS remark):修正并發(fā)標(biāo)記期間因用戶程序繼續(xù)運(yùn)行而導(dǎo)致標(biāo)記產(chǎn)生變動(dòng)的那一部分對(duì)象的標(biāo)記記錄
并發(fā)清除(CMS concurrent sweep: 已死對(duì)象將會(huì)就地釋放)
可以看到,初始標(biāo)記宜鸯、重新標(biāo)記需要STW(stop the world 即:掛起用戶線程)操作憔古。因?yàn)樽詈臅r(shí)的操作是并發(fā)標(biāo)記和并發(fā)清除。所以總體上我們認(rèn)為CMS的GC與用戶線程是并發(fā)運(yùn)行的淋袖。
優(yōu)點(diǎn):并發(fā)收集鸿市、低停頓
缺點(diǎn):
CMS默認(rèn)啟動(dòng)的回收線程數(shù)=(CPU數(shù)目+3)*4
當(dāng)CPU數(shù)>4時(shí), GC線程最多占用不超過(guò)25%的CPU資源, 但是當(dāng)CPU數(shù)<=4時(shí), GC線程可能就會(huì)過(guò)多的占用用戶CPU資源, 從而導(dǎo)致應(yīng)用程序變慢, 總吞吐量降低.
無(wú)法清除浮動(dòng)垃圾(GC運(yùn)行到并發(fā)清除階段時(shí)用戶線程產(chǎn)生的垃圾),因?yàn)橛脩艟€程是需要內(nèi)存的即碗,如果浮動(dòng)垃圾施放不及時(shí)焰情,很可能就造成內(nèi)存溢出,所以CMS不能像別的垃圾收集器那樣等老年代幾乎滿了才觸發(fā)剥懒,CMS提供了參數(shù)-XX:CMSInitiatingOccupancyFraction來(lái)設(shè)置GC觸發(fā)百分比(1.6后默認(rèn)92%),當(dāng)然我們還得設(shè)置啟用該策略-XX:+UseCMSInitiatingOccupancyOnly
因?yàn)镃MS采用標(biāo)記-清除算法内舟,所以可能會(huì)帶來(lái)很多的碎片,如果碎片太多沒(méi)有清理初橘,jvm會(huì)因?yàn)闊o(wú)法分配大對(duì)象內(nèi)存而觸發(fā)GC验游,因此CMS提供了-XX:+UseCMSCompactAtFullCollection參數(shù)充岛,它會(huì)在GC執(zhí)行完后接著進(jìn)行碎片整理,但是又會(huì)有個(gè)問(wèn)題耕蝉,碎片整理不能并發(fā)崔梗,所以必須單線程去處理,所以如果每次GC完都整理用戶線程stop的時(shí)間累積會(huì)很長(zhǎng)垒在,所以XX:CMSFullGCsBeforeCompaction參數(shù)設(shè)置隔幾次GC進(jìn)行一次碎片整理(默認(rèn)為0)炒俱。
G1
同優(yōu)秀的CMS垃圾回收器一樣,G1也是關(guān)注最小時(shí)延的垃圾回收器爪膊,也同樣適合大尺寸堆內(nèi)存的垃圾收集,官方也推薦使用G1來(lái)代替選擇CMS砸王。G1最大的特點(diǎn)是引入分區(qū)的思路推盛,弱化分代的概念,合理利用垃圾收集各個(gè)周期的資源谦铃,解決了其他收集器甚至CMS的眾多缺陷耘成。
因?yàn)槊總€(gè)區(qū)都有E、S驹闰、O代瘪菌,所以在G1中,不需要對(duì)整個(gè)Eden等代進(jìn)行回收嘹朗,而是尋找可回收對(duì)象比較多的區(qū)师妙,然后進(jìn)行回收(雖然也需要STW操作,但是花費(fèi)的時(shí)間是很少的)屹培,保證高效率默穴。
新生代收集
G1的新生代收集跟ParNew類似,如果存活時(shí)間超過(guò)某個(gè)閾值褪秀,就會(huì)被轉(zhuǎn)移到S/O區(qū)蓄诽。
年輕代內(nèi)存由一組不連續(xù)的heap區(qū)組成, 這種方法使得可以動(dòng)態(tài)調(diào)整各代區(qū)域的大小
老年代收集
分為以下幾個(gè)階段:
初始標(biāo)記 (Initial Mark: Stop the World Event)
在G1中, 該操作附著一次年輕代GC, 以標(biāo)記Survivor中有可能引用到老年代對(duì)象的Regions.
掃描根區(qū)域 (Root Region Scanning: 與應(yīng)用程序并發(fā)執(zhí)行)
掃描Survivor中能夠引用到老年代的references. 但必須在Minor GC觸發(fā)前執(zhí)行完
并發(fā)標(biāo)記 (Concurrent Marking : 與應(yīng)用程序并發(fā)執(zhí)行)
在整個(gè)堆中查找存活對(duì)象, 但該階段可能會(huì)被Minor GC中斷
重新標(biāo)記 (Remark : Stop the World Event)
完成堆內(nèi)存中存活對(duì)象的標(biāo)記. 使用snapshot-at-the-beginning(SATB, 起始快照)算法, 比CMS所用算法要快得多(空Region直接被移除并回收, 并計(jì)算所有區(qū)域的活躍度).
清理 (Cleanup : Stop the World Event and Concurrent)
在含有存活對(duì)象和完全空閑的區(qū)域上進(jìn)行統(tǒng)計(jì)(STW)、擦除Remembered Sets(使用Remembered Set來(lái)避免掃描全堆媒吗,每個(gè)區(qū)都有對(duì)應(yīng)一個(gè)Set用來(lái)記錄引用信息仑氛、讀寫操作記錄)(STW)、重置空regions并將他們返還給空閑列表(free list)(Concurrent)
18. JVM中對(duì)象的創(chuàng)建過(guò)程
1. 拿到內(nèi)存創(chuàng)建指令
當(dāng)虛擬機(jī)遇到內(nèi)存創(chuàng)建的指令的時(shí)候(new 類名)闸英,來(lái)到了方法區(qū)锯岖,找 根據(jù)new的參數(shù)在常量池中定位一個(gè)類的符號(hào)引用。
2. 檢查符號(hào)引用
檢查該符號(hào)引用有沒(méi)有被加載自阱、解析和初始化過(guò)嚎莉,如果沒(méi)有則執(zhí)行類加載過(guò)程,否則直接準(zhǔn)備為新的對(duì)象分配內(nèi)存
3. 分配內(nèi)存
虛擬機(jī)為對(duì)象分配內(nèi)存(堆)分配內(nèi)存分為指針碰撞和空閑列表兩種方式沛豌;分配內(nèi)存還要要保證并發(fā)安全趋箩,有兩種方式赃额。
3.1. 指針碰撞
所有的存儲(chǔ)空間分為兩部分,一部分是空閑叫确,一部分是占用跳芳,需要分配空間的時(shí)候,只需要計(jì)算指針移動(dòng)的長(zhǎng)度即可竹勉。
3.2. 空閑列表
虛擬機(jī)維護(hù)了一個(gè)空閑列表飞盆,需要分配空間的時(shí)候去查該空閑列表進(jìn)行分配并對(duì)空閑列表做更新。
可以看出次乓,內(nèi)存分配方式是由java堆是否規(guī)整決定的吓歇,java堆的規(guī)整是由垃圾回收機(jī)制來(lái)決定的
3.2.5 安全性問(wèn)題的思考
假如分配內(nèi)存策略是指針碰撞,如果在高并發(fā)情況下票腰,多個(gè)對(duì)象需要分配內(nèi)存城看,如果不做處理,肯定會(huì)出現(xiàn)線程安全問(wèn)題杏慰,導(dǎo)致一些對(duì)象分配不到空間等测柠。
下面是解決方案:
3.3 線程同步策略
也就是每個(gè)線程都進(jìn)行同步,防止出現(xiàn)線程安全缘滥。
3.4. 本地線程分配緩沖
也稱TLAB(Thread Local Allocation Buffer)轰胁,在堆中為每一個(gè)線程分配一小塊獨(dú)立的內(nèi)存,這樣以來(lái)就不存并發(fā)問(wèn)題了朝扼,Java 層面與之對(duì)應(yīng)的是 ThreadLocal 類的實(shí)現(xiàn)
4. 初始化
分配完內(nèi)存后要對(duì)對(duì)象的頭(Object Header)進(jìn)行初始化赃阀,這新信息包括:該對(duì)象對(duì)應(yīng)類的元數(shù)據(jù)、該對(duì)象的GC代擎颖、對(duì)象的哈希碼凹耙。
抽象數(shù)據(jù)類型默認(rèn)初始化為null,基本數(shù)據(jù)類型為0肠仪,布爾為false....
5. 調(diào)用對(duì)象的初始化方法
也就是執(zhí)行構(gòu)造方法肖抱。