初學者或初級程序員在面試時若是能證實本身具備分析內存用量和內存調優的能力,這至關有利,由於這是針對5年左右相關經驗的高級程序員的要求。程序員
若是在面試時面試官主動問及這方面的問題,你們能夠按照以下的思路由淺入深地依次闡述,若是沒問,你們也能夠用到下面說起的方法毫無痕跡地(不突兀不顯擺)展現本身這方面的能力。面試
若是面試官問,「你是否瞭解虛擬機體系結構」,那麼你們能夠按9.1提到的內容,先畫出虛擬機的各部件,隨後依次說明各部分的做用。算法
其實面試官也知道這部分對項目開發的幫助並不大,因此你們不用過於深刻,好比能夠不用深刻回答.class字節碼文件的結構和類加載器的流程(因爲實用性不強,本文也沒講)。但你們必定得總結性地說出靜態數據、基本數據類型和引用等數據的存儲位置,這部分的內容咱們在9.1.3部分講過。這樣就能引出後面的關於「內存」的話題。數據庫
若是面試官沒有問及虛擬機體系結構的問題,那麼也沒關係,畢竟這塊知識點實用性通常,說出來屬於錦上添花。但你們應當經過後文給出的方法,找機會引出「內存「這個話題。設計模式
通常來講,大多數面試官會問垃圾回收的流程,這樣你們就有機會經過堆結構說出垃圾回收的流程,進而展現本身內存調優方面的能力。性能
或者你們能夠更保險點,在簡歷的最近項目介紹里加上相似這樣描述,「這個項目的內存要求比較高,雖然在項目裏分配的對象很多,但這個項目只被分配了1G內存,因此在這個項目裏,我實踐了一些定位排查內存問題的技能,也作了些調優的工做「,這樣面試官見到簡歷的描述,就會天然而然地提問了。優化
更穩妥的方法是,在面試中總會有「項目介紹」這個環節,面試官會讓候選人介紹最近的(或最拿得出手)的一個項目,這樣你們就能夠順勢說出剛纔已經給出的描述。命令行
或者,你們能夠在回答數據庫或集合等方面的問題時引出這個話題,好比回答完JDBC問題後,你們能夠說一句,「用好的Connection對象咱們會及時關閉,不然它所佔用的內存對象沒法被GC回收」,或者在談及List等集合類型時,同時多說一句,「用好的集合對象咱們會及時clear掉,不然這個集合也會對一些對象產生強引用,這樣就會延遲對象的回收時間」。設計
總之,內存調優這方面的能力不說出來未免有些惋惜,你們能夠根據上述的描述觸類旁通,在面試中找一切能夠的機會引入這個話題。日誌
不過這裏也請你們注意些技巧,別自說自話地一股腦地全說,這樣反而過猶不及。打個很是不恰當的比方,就像釣魚,你們能夠先下個餌,好比在介紹項目時先粗略地提到本身作過這方面的事情,但先別說具體的,等面試官主動問了,再具體地按下文給出的思路一一展開。
萬一面試官在你們的再三暗示下仍是沒接口繼續問(雖然這種可能性很是小),那說明面試官真的對此沒興趣,或者說你應聘的公司對此沒需求,那麼你們就只能此打住了。
在找到合適的機會後,你們能夠先從堆的結構入手,進而詳細說明垃圾回收的流程。好比你們被問到,你對Java中的垃圾回收機制瞭解多少?或者當你說出在項目裏你作過內存調優,面試官進一步讓你說出細節,那麼你們能夠按次序說出以下的要點。
1 能夠先說下,new出來的對象都放在堆區裏。
2 能夠說下堆的結構,好比堆裏分年輕區,年老區和持久區,年輕區裏還分伊甸區和兩個緩衝區,持久區主要存放的是Java類信息或在代碼裏經過import引入的類信息,垃圾回收流程主要涉及到的是年輕和年老區。
3 能夠說下垃圾回收的通常流程,好比何時會觸發輕量級回收,何時會觸發Full GC。
4 能夠說下虛擬機是憑什麼判斷對象能夠被回收(對象上沒有強引用,則會在下次GC流程時被回收),也能夠說下「引用計數法」和「根搜索算法」以及它們的差異。
5 能夠說下,程序員能夠經過System.gc()來啓動Full GC,但Full GC並非在調用和這個方法後就啓動。不過根據實踐,二者的時間間隔不會太長。
在說完上述要點後,你們最後必定得引出下一個「內存調優」這個話題,好比能夠說,「雖說Java虛擬機能自動回收內存,但在平時寫代碼時,咱們會遵循一些要點來提高內存性能,在項目裏,咱們還會監控內存使用量,並且我在項目裏也有過排查OOM問題的經驗「。這樣的話就能進一步展現本身的「調優和排查」能力。
咱們以前提到過這方面技能,這裏來總結一下要點,在面試時,你們能夠在閱讀本章相關內容的基礎上自行展開敘述。
1 物理對象(好比Connectio或IO)用好以後得及時close。
2 大的對象用好後應當及時設置成null,以撤銷強引用。
3 集合對象用好後應當及時clear。
4 儘可能別頻繁地使用String(或其它不變類)對象,這樣容易產生內存碎片。
5 儘量地使用軟和弱引用,由於這樣能提前對象的被回收時間。
6 不建議重寫finalize方法。
7 能夠經過調整命令行參數來調整堆內存的性能,但同時請注意,在項目裏通常只會修改-Xms或-Xmx參數,或者再加一些日誌打印和保存Dump文件的參數。在修改其它參數時,項目組通常會很慎重,因此你們能夠說本身瞭解其它的參數,但若是沒有十足的把握,別說本身在項目裏調整過相似於「設置年輕區與年老區的比值」等容易產生內存問題的參數。
解決問題相對容易,但定位問題就相對難了,因此建議你們能夠再進一步展現本身「監控、定位和調優」方面的能力,好比能夠經過以下的敘述引入到這個話題,「除了這些代碼上的技巧外,咱們在項目上線後還必須監控內存使用量,一旦發生OOM或Stop The World等問題,咱們得經過必定的方法來定位問題點,從而再用剛纔提到的技巧來優化內存」。
在面試時,面試官是無法當場給出一個實際的問題讓你們來現場解決,只要候選人敘述得不離譜,一些要點能說上來,通常就會認爲候選人具有這方面的能力。
這塊你們能夠說,好比經過JConsole確認有內存問題,經過Dump文件來查看OOM的現場,從而再經過GC日誌和代碼裏輸出的內存使用量來定位問題點。在面試前,建議你們多看一些GC日誌文件和Dump文件,這樣在敘述時就更會成竹在胸了。
經過閱讀這個章節,你們必定能體會到,「內存監控、定位和調優」方面的能力並不難學,也不難準備面試中的說辭,並且在面試中,最多用上五分鐘就能把這部分的知識點說全,但你們一旦按上述思路展現出了這方面能力,那麼很大程度能改變面試官對你的評價。
根據咱們的面試經驗,初級程序員的平均能力其實差不了多少,在不少時候咱們是沒法取捨的。好比咱們要從10我的裏招5我的進來,除去特別好的(通常2個)和特別差的(通常也是2個),有6我的的綜合能力(包括學校背景工做背景項目經驗和麪試結果)是差很少的,也就是說咱們很難從這6我的裏挑選出3我的。
這時,若是這6人中誰有相似於內存調優(或者前章提到的設計模式)等方面的加分項,那麼就必定會優先考慮這我的。