在面试中如何展示虚拟机和内存调优技能
? ??初學(xué)者或初級(jí)程序員在面試時(shí)如果能證明自己具有分析內(nèi)存用量和內(nèi)存調(diào)優(yōu)的能力,這相當(dāng)有利,因?yàn)檫@是針對(duì)5年左右相關(guān)經(jīng)驗(yàn)的高級(jí)程序員的要求。
? ? 如果在面試時(shí)面試官主動(dòng)問(wèn)及這方面的問(wèn)題,大家可以按照如下的思路由淺入深地依次闡述,如果沒(méi)問(wèn),大家也可以用到下面提及的方法毫無(wú)痕跡地(不突兀不顯擺)展示自己這方面的能力。
1 從虛擬機(jī)體系結(jié)構(gòu)引出內(nèi)存管理的話題
? ? 如果面試官問(wèn),“你是否了解虛擬機(jī)體系結(jié)構(gòu)”,那么大家可以按9.1提到的內(nèi)容,先畫出虛擬機(jī)的各部件,隨后依次說(shuō)明各部分的作用。
? ? 其實(shí)面試官也知道這部分對(duì)項(xiàng)目開(kāi)發(fā)的幫助并不大,所以大家不用過(guò)于深入,比如可以不用深入回答.class字節(jié)碼文件的結(jié)構(gòu)和類加載器的流程(由于實(shí)用性不強(qiáng),本文也沒(méi)講)。但大家一定得總結(jié)性地說(shuō)出靜態(tài)數(shù)據(jù)、基本數(shù)據(jù)類型和引用等數(shù)據(jù)的存儲(chǔ)位置,這部分的內(nèi)容我們?cè)?.1.3部分講過(guò)。這樣就能引出后面的關(guān)于“內(nèi)存”的話題。
? ? 如果面試官?zèng)]有問(wèn)及虛擬機(jī)體系結(jié)構(gòu)的問(wèn)題,那么也不要緊,畢竟這塊知識(shí)點(diǎn)實(shí)用性一般,說(shuō)出來(lái)屬于錦上添花。但大家應(yīng)當(dāng)通過(guò)后文給出的方法,找機(jī)會(huì)引出“內(nèi)存“這個(gè)話題。
2如何自然地引出內(nèi)存話題
? ? 一般來(lái)說(shuō),大多數(shù)面試官會(huì)問(wèn)垃圾回收的流程,這樣大家就有機(jī)會(huì)通過(guò)堆結(jié)構(gòu)說(shuō)出垃圾回收的流程,進(jìn)而展示自己內(nèi)存調(diào)優(yōu)方面的能力。
? ? 或者大家可以更保險(xiǎn)點(diǎn),在簡(jiǎn)歷的最近項(xiàng)目介紹里加上類似這樣描述,“這個(gè)項(xiàng)目的內(nèi)存要求比較高,雖然在項(xiàng)目里分配的對(duì)象不少,但這個(gè)項(xiàng)目只被分配了1G內(nèi)存,所以在這個(gè)項(xiàng)目里,我實(shí)踐了一些定位排查內(nèi)存問(wèn)題的技能,也做了些調(diào)優(yōu)的工作“,這樣面試官見(jiàn)到簡(jiǎn)歷的描述,就會(huì)自然而然地提問(wèn)了。
? ? 更穩(wěn)妥的方法是,在面試中總會(huì)有“項(xiàng)目介紹”這個(gè)環(huán)節(jié),面試官會(huì)讓候選人介紹最近的(或最拿得出手)的一個(gè)項(xiàng)目,這樣大家就可以順勢(shì)說(shuō)出剛才已經(jīng)給出的描述。
? ? 或者,大家可以在回答數(shù)據(jù)庫(kù)或集合等方面的問(wèn)題時(shí)引出這個(gè)話題,比如回答完JDBC問(wèn)題后,大家可以說(shuō)一句,“用好的Connection對(duì)象我們會(huì)及時(shí)關(guān)閉,否則它所占用的內(nèi)存對(duì)象無(wú)法被GC回收”,或者在談及List等集合類型時(shí),同時(shí)多說(shuō)一句,“用好的集合對(duì)象我們會(huì)及時(shí)clear掉,否則這個(gè)集合也會(huì)對(duì)一些對(duì)象產(chǎn)生強(qiáng)引用,這樣就會(huì)延遲對(duì)象的回收時(shí)間”。
? ? 總之,內(nèi)存調(diào)優(yōu)這方面的能力不說(shuō)出來(lái)未免有些可惜,大家可以根據(jù)上述的描述舉一反三,在面試中找一切可以的機(jī)會(huì)引入這個(gè)話題。
? ? 不過(guò)這里也請(qǐng)大家注意些技巧,別自說(shuō)自話地一股腦地全說(shuō),這樣反而過(guò)猶不及。打個(gè)非常不恰當(dāng)?shù)谋确?#xff0c;就像釣魚,大家可以先下個(gè)餌,比如在介紹項(xiàng)目時(shí)先粗略地提到自己做過(guò)這方面的事情,但先別說(shuō)具體的,等面試官主動(dòng)問(wèn)了,再具體地按下文給出的思路一一展開(kāi)。
? ? 萬(wàn)一面試官在大家的再三暗示下還是沒(méi)接口繼續(xù)問(wèn)(雖然這種可能性非常小),那說(shuō)明面試官真的對(duì)此沒(méi)興趣,或者說(shuō)你應(yīng)聘的公司對(duì)此沒(méi)需求,那么大家就只能此打住了。
3 根據(jù)堆區(qū)結(jié)構(gòu),闡述垃圾回收的流程
在找到合適的機(jī)會(huì)后,大家可以先從堆的結(jié)構(gòu)入手,進(jìn)而詳細(xì)說(shuō)明垃圾回收的流程。比如大家被問(wèn)到,你對(duì)Java中的垃圾回收機(jī)制了解多少?或者當(dāng)你說(shuō)出在項(xiàng)目里你做過(guò)內(nèi)存調(diào)優(yōu),面試官進(jìn)一步讓你說(shuō)出細(xì)節(jié),那么大家可以按次序說(shuō)出如下的要點(diǎn)。
1 可以先說(shuō)下,new出來(lái)的對(duì)象都放在堆區(qū)里。
2 可以說(shuō)下堆的結(jié)構(gòu),比如堆里分年輕區(qū),年老區(qū)和持久區(qū),年輕區(qū)里還分伊甸區(qū)和兩個(gè)緩沖區(qū),持久區(qū)主要存放的是Java類信息或在代碼里通過(guò)import引入的類信息,垃圾回收流程主要涉及到的是年輕和年老區(qū)。
3 可以說(shuō)下垃圾回收的一般流程,比如什么時(shí)候會(huì)觸發(fā)輕量級(jí)回收,什么時(shí)候會(huì)觸發(fā)Full GC。
4 可以說(shuō)下虛擬機(jī)是憑什么判斷對(duì)象可以被回收(對(duì)象上沒(méi)有強(qiáng)引用,則會(huì)在下次GC流程時(shí)被回收),也可以說(shuō)下“引用計(jì)數(shù)法”和“根搜索算法”以及它們的差別。
5 可以說(shuō)下,程序員可以通過(guò)System.gc()來(lái)啟動(dòng)Full GC,但Full GC并不是在調(diào)用和這個(gè)方法后就啟動(dòng)。不過(guò)根據(jù)實(shí)踐,兩者的時(shí)間間隔不會(huì)太長(zhǎng)。
在說(shuō)完上述要點(diǎn)后,大家最后一定得引出下一個(gè)“內(nèi)存調(diào)優(yōu)”這個(gè)話題,比如可以說(shuō),“雖然說(shuō)Java虛擬機(jī)能自動(dòng)回收內(nèi)存,但在平時(shí)寫代碼時(shí),我們會(huì)遵循一些要點(diǎn)來(lái)提升內(nèi)存性能,在項(xiàng)目里,我們還會(huì)監(jiān)控內(nèi)存使用量,而且我在項(xiàng)目里也有過(guò)排查OOM問(wèn)題的經(jīng)驗(yàn)“。這樣的話就能進(jìn)一步展示自己的“調(diào)優(yōu)和排查”能力。
4 再進(jìn)一步說(shuō)明如何寫出高性能的代碼
我們之前提到過(guò)這方面技能,這里來(lái)總結(jié)一下要點(diǎn),在面試時(shí),大家可以在閱讀本章相關(guān)內(nèi)容的基礎(chǔ)上自行展開(kāi)敘述。
1 物理對(duì)象(比如Connectio或IO)用好之后得及時(shí)close。
2 大的對(duì)象用好后應(yīng)當(dāng)及時(shí)設(shè)置成null,以撤銷強(qiáng)引用。
3 集合對(duì)象用好后應(yīng)當(dāng)及時(shí)clear。
4 盡量別頻繁地使用String(或其它不變類)對(duì)象,這樣容易產(chǎn)生內(nèi)存碎片。
5 盡可能地使用軟和弱引用,因?yàn)檫@樣能提早對(duì)象的被回收時(shí)間。
6 不建議重寫finalize方法。
7 可以通過(guò)調(diào)整命令行參數(shù)來(lái)調(diào)整堆內(nèi)存的性能,但同時(shí)請(qǐng)注意,在項(xiàng)目里一般只會(huì)修改-Xms或-Xmx參數(shù),或者再加一些日志打印和保存Dump文件的參數(shù)。在修改其它參數(shù)時(shí),項(xiàng)目組一般會(huì)很慎重,所以大家可以說(shuō)自己了解其它的參數(shù),但如果沒(méi)有十足的把握,別說(shuō)自己在項(xiàng)目里調(diào)整過(guò)類似于“設(shè)置年輕區(qū)與年老區(qū)的比值”等容易產(chǎn)生內(nèi)存問(wèn)題的參數(shù)。
? ? 解決問(wèn)題相對(duì)容易,但定位問(wèn)題就相對(duì)難了,所以建議大家可以再進(jìn)一步展示自己“監(jiān)控、定位和調(diào)優(yōu)”方面的能力,比如可以通過(guò)如下的敘述引入到這個(gè)話題,“除了這些代碼上的技巧外,我們?cè)陧?xiàng)目上線后還必須監(jiān)控內(nèi)存使用量,一旦發(fā)生OOM或Stop The World等問(wèn)題,我們得通過(guò)一定的方法來(lái)定位問(wèn)題點(diǎn),從而再用剛才提到的技巧來(lái)優(yōu)化內(nèi)存”。
5 最后展示監(jiān)控、定位和調(diào)優(yōu)方面的綜合能力
? ? 在面試時(shí),面試官是沒(méi)法當(dāng)場(chǎng)給出一個(gè)實(shí)際的問(wèn)題讓大家來(lái)現(xiàn)場(chǎng)解決,只要候選人敘述得不離譜,一些要點(diǎn)能說(shuō)上來(lái),一般就會(huì)認(rèn)為候選人具備這方面的能力。
? ? 這塊大家可以說(shuō),比如通過(guò)JConsole確認(rèn)有內(nèi)存問(wèn)題,通過(guò)Dump文件來(lái)查看OOM的現(xiàn)場(chǎng),從而再通過(guò)GC日志和代碼里輸出的內(nèi)存使用量來(lái)定位問(wèn)題點(diǎn)。在面試前,建議大家多看一些GC日志文件和Dump文件,這樣在敘述時(shí)就更會(huì)胸有成竹了。
? ? 通過(guò)閱讀這個(gè)章節(jié),大家一定能體會(huì)到,“內(nèi)存監(jiān)控、定位和調(diào)優(yōu)”方面的能力并不難學(xué),也不難準(zhǔn)備面試中的說(shuō)辭,而且在面試中,最多用上五分鐘就能把這部分的知識(shí)點(diǎn)說(shuō)全,但大家一旦按上述思路展示出了這方面能力,那么很大程度能改變面試官對(duì)你的評(píng)價(jià)。
? ? 根據(jù)我們的面試經(jīng)驗(yàn),初級(jí)程序員的平均能力其實(shí)差不了多少,在很多時(shí)候我們是無(wú)法取舍的。比如我們要從10個(gè)人里招5個(gè)人進(jìn)來(lái),除去特別好的(一般2個(gè))和特別差的(一般也是2個(gè)),有6個(gè)人的綜合能力(包括學(xué)校背景工作背景項(xiàng)目經(jīng)驗(yàn)和面試結(jié)果)是差不多的,也就是說(shuō)我們很難從這6個(gè)人里挑選出3個(gè)人。
? ? 這時(shí),如果這6人中誰(shuí)有類似于內(nèi)存調(diào)優(yōu)(或者前章提到的設(shè)計(jì)模式)等方面的加分項(xiàng),那么就一定會(huì)優(yōu)先考慮這個(gè)人。
轉(zhuǎn)載于:https://www.cnblogs.com/JavaArchitect/p/8182040.html
總結(jié)
以上是生活随笔為你收集整理的在面试中如何展示虚拟机和内存调优技能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Code for City 黑客松 |
- 下一篇: Oracle 本地验证和密码文件