1. 內(nèi)存信息
2. 對(duì)象的訪問定位
Java方法執(zhí)行時(shí)都是對(duì)各種對(duì)象進(jìn)行操作崇裁,而這些對(duì)象都是存放在Java堆中的撇他,Java方法中變量相關(guān)的信息是存放在虛擬機(jī)棧中的,這些變量只是一個(gè)指向?qū)ο蟮囊茫苑椒▓?zhí)行時(shí)就會(huì)涉及到對(duì)象的定位。對(duì)象定位主要有兩種方式:
-
使用句柄訪問
使用句柄最大的好處就是對(duì)象引用中存儲(chǔ)的是穩(wěn)定的句柄地址仇奶,在對(duì)象被移動(dòng)(垃圾收集中很普遍)是只會(huì)改變句柄中的實(shí)例數(shù)據(jù)指針,而對(duì)象引用本身不需要修改比驻。
-
使用直接指針訪問
使用直接訪問的最大好處是速度快该溯,它節(jié)省了一次指針定位的時(shí)間開銷。
3. String.intern()方法
String.intern()方法是一個(gè)Native方法(本地方法)嫁艇,它的作用是:如果字符串常量池中已經(jīng)包含一個(gè)等于此String對(duì)象的字符串朗伶,則返回代表池中這個(gè)字符串的String對(duì)象,否則步咪,將此String對(duì)象包含的字符串添加到常量池中,并返回此String對(duì)象的引用益楼。
4. 垃圾收集與內(nèi)存分配策略
分代收集:
首先猾漫,新對(duì)象的內(nèi)存分配都是先在Eden區(qū)域中進(jìn)行的点晴,當(dāng)Eden區(qū)域的空間不足于分配新對(duì)象時(shí),就會(huì)觸發(fā)年輕代上的垃圾回收悯周,一般使用復(fù)制算法將存活對(duì)象復(fù)制到一個(gè)Survivor區(qū)中粒督,同時(shí)對(duì)象年齡加1.當(dāng)?shù)诙蝝inor gc被觸發(fā)時(shí),JVM會(huì)通過Mark算法找出所有在Eden內(nèi)存區(qū)域和Survivor1內(nèi)存區(qū)域存活的對(duì)象禽翼,并將他們拷貝到新的Survivor2內(nèi)存區(qū)域屠橄,同時(shí)對(duì)象的年齡加1. 最后,清除所有在Eden內(nèi)存區(qū)域和Survivor1內(nèi)存區(qū)域的非可達(dá)對(duì)象闰挡。當(dāng)對(duì)象的年齡足夠大(這個(gè)年齡可以通過JVM參數(shù)進(jìn)行指定)锐墙,當(dāng)minor gc再次發(fā)生時(shí),它會(huì)從Survivor內(nèi)存區(qū)域中升級(jí)到年老代中长酗。當(dāng)minor gc發(fā)生時(shí)溪北,又有對(duì)象從Survivor區(qū)域升級(jí)到老年代區(qū)域中,但是老年代區(qū)域已經(jīng)沒有空間容納新的對(duì)象了夺脾,那么這個(gè)時(shí)候就會(huì)觸發(fā)年老代上的垃圾回收之拨,一般采用標(biāo)記-整理算法。
其他要點(diǎn):大對(duì)象(需要大量連續(xù)內(nèi)存空間的Java對(duì)象)直接進(jìn)入老年代咧叭。
5.java虛擬機(jī)類加載機(jī)制
雙親委派模型:
從Java虛擬機(jī)的角度來講只存在兩種不同的類加載器蚀乔,一種是啟動(dòng)類加載器,由C++實(shí)現(xiàn)菲茬,是虛擬機(jī)自身的一部分乙墙,另一種就是其他類加載器,這些類加載器都是有Java語言實(shí)現(xiàn)獨(dú)立于虛擬機(jī)外部生均。并且全都繼承自抽象類java.lang.ClassLoader听想。
雙親委派模型:雙親委派模型要求除了頂層的啟動(dòng)類加載器外,其余的類加載器都應(yīng)當(dāng)有自己的父類加載器马胧,這里類加載器之間的父子關(guān)系一般不會(huì)以繼承的關(guān)系來實(shí)現(xiàn)汉买,而是都是用組合的關(guān)系來實(shí)現(xiàn)。
雙親委派模型的工作過程是:如果一個(gè)類加載器收到了類加載的請(qǐng)求佩脊,他首先不會(huì)自己去嘗試加載這個(gè)類蛙粘,而是把這個(gè)請(qǐng)求為派給父類的加載器去完成,每個(gè)層次的加載器都是如此威彰,因此所有的加載請(qǐng)求最終都應(yīng)該川大到頂層的啟動(dòng)類加載器中出牧,只有當(dāng)父類加載器反饋?zhàn)约簾o法完成這個(gè)加載請(qǐng)求是,子加載器才會(huì)嘗試自己去加載歇盼。