在面試中如何展現虛擬機和內存調優技能

在這個寒冬中,咱們得不斷提高本身的能力,因此此次,我就針對「虛擬機描述」這個點擴展出去,具體講些在面試中展現虛擬機內存調優能力的話術。程序員

在面試中展現出這個技能有什麼好處?初學者或初級程序員在面試時若是能證實本身具備這方面的能力,這至關有利,由於這是針對5年左右相關經驗的高級程序員的要求。若是在面試時面試官主動問及這方面的問題,你們能夠按照以下的思路由淺入深地依次闡述,若是沒問,你們也能夠用到下面說起的方法毫無痕跡地(不突兀不顯擺)展現本身這方面的能力。面試

1、從虛擬機體系結構引出內存管理的話題

若是面試官有直接問,「你是否瞭解虛擬機體系結構」,那麼你們能夠先畫出虛擬機的各部件,隨後依次說明各部分的做用算法

其實面試官也知道這部分對項目開發的幫助並不大,因此你們不用過於深刻,好比能夠不用深刻回答.class字節碼文件的結構和類加載器的流程。但你們必定得總結性地說出靜態數據、基本數據類型和引用等數據的存儲位置。這樣就能引出後面的關於「內存」的話題。sql

若是面試官沒有問及虛擬機體系結構的問題,那麼也沒關係,畢竟這塊知識點實用性通常,說出來屬於錦上添花。但你們應當經過後文部分給出的方法,找機會引出「內存「這個話題。數據庫

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程序員,我這邊準備免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)

爲何某些人會一直比你優秀,是由於他自己就很優秀還一直在持續努力變得更優秀,而你是否是還在知足於現狀心裏在竊喜!但願讀到這的您能點個小贊和關注下我,之後還會更新技術乾貨,謝謝您的支持!

資料領取方式:加入Java技術交流羣963944895點擊加入羣聊,私信管理員便可免費領取

怎麼提升代碼質量?——來自阿里P8架構師的研發經驗總結

阿里P8分享Java架構師的學習路線,第六點尤其重要

每一個Java開發者應該知道的八個工具

想面試Java架構師?這些最基本的東西你都會了嗎?

畫個圖來找你的核心競爭力,變中年危機爲加油站

哪有什麼中年危機,不過是把定目標當成了有計劃

被裁人不是寒冬重點,重點是怎麼破解職業瓶頸

相關文章
相關標籤/搜索