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