面試官:今天要不來聊聊JVM調(diào)優(yōu)相關的吧?
面試官:你曾經(jīng)在生產(chǎn)環(huán)境下有過調(diào)優(yōu)JVM的經(jīng)歷嗎?
候選者:沒有
面試官:...
候選者:嗯...是這樣的,我們一般優(yōu)化系統(tǒng)的思路是這樣的
候選者:1. 一般來說關系型數(shù)據(jù)庫是先到瓶頸,首先排查是否為數(shù)據(jù)庫的問題
候選者:(這個過程中就需要評估自己建的索引是否合理、是否需要引入分布式緩存、是否需要分庫分表等等)
候選者:2. 然后,我們會考慮是否需要擴容(橫向和縱向都會考慮)
候選者:(這個過程中我們會懷疑是系統(tǒng)的壓力過大或者是系統(tǒng)的硬件能力不足導致系統(tǒng)頻繁出現(xiàn)問題)
候選者:3. 接著,應用代碼層面上排查并優(yōu)化
候選者:(擴容是不能無止境的,里頭里外都是錢阿。這個過程中我們會審視自己寫的代碼是否存在資源浪費的問題,又或者是在邏輯上可存在優(yōu)化的地方,比如說通過并行的方式處理某些請求)
候選者:4. 再接著,JVM層面上排查并優(yōu)化
候選者:(審視完代碼之后,這個過程我們觀察JVM是否存在多次GC問題等等)
候選者:5. 最后,網(wǎng)絡和操作系統(tǒng)層面排查
候選者:(這個過程查看內(nèi)存/CPU/網(wǎng)絡/硬盤讀寫指標是否正常等等)
候選者:絕大多數(shù)情況下,到第三步就結束了,一般經(jīng)過「運維團隊」給我們設置的JVM和機器上的參數(shù),已經(jīng)滿足絕大多數(shù)的需求了。
候選者:之前有過其他團隊在「大促」發(fā)現(xiàn)接口處理超時的問題,那時候查各種監(jiān)控懷疑是FULL GC導致的
候選者:第一想法不是說去調(diào)節(jié)各種JVM參數(shù)來進行優(yōu)化,而是直接加機器
候選者:(用最粗暴的方法,解決問題是最簡單的,擴容YYDS)
面試官:確實
候選者:不過,我是學過JVM相關的調(diào)優(yōu)命令和思路的。
候選者:在我的理解下,調(diào)優(yōu)JVM其實就是在「理解」JVM內(nèi)存結構以及各種垃圾收集器前提下,結合自己的現(xiàn)有的業(yè)務來「調(diào)整參數(shù)」,使自己的應用能夠正常穩(wěn)定運行。
候選者:一般調(diào)優(yōu)JVM我們認為會有幾種指標可以參考:『吞吐量』、『停頓時間』和『垃圾回收頻率』
候選者:基于這些指標,我們就有可能需要調(diào)整:
候選者:1. 內(nèi)存區(qū)域大小以及相關策略(比如整塊堆內(nèi)存占多少、新生代占多少、老年代占多少、Survivor占多少、晉升老年代的條件等等)
候選者:比如(-Xmx:設置堆的最大值、-Xms:設置堆的初始值、-Xmn:表示年輕代的大小、-XX:SurvivorRatio:伊甸區(qū)和幸存區(qū)的比例等等)
候選者:(按經(jīng)驗來說:IO密集型的可以稍微把「年輕代」空間加大些,因為大多數(shù)對象都是在年輕代就會滅亡。內(nèi)存計算密集型的可以稍微把「老年代」空間加大些,對象存活時間會更長些)
候選者:2. 垃圾回收器(選擇合適的垃圾回收器,以及各個垃圾回收器的各種調(diào)優(yōu)參數(shù))
候選者:比如(-XX:+UseG1GC:指定 JVM 使用的垃圾回收器為 G1、-XX:MaxGCPauseMillis:設置目標停頓時間、-XX:InitiatingHeapOccupancyPercent:當整個堆內(nèi)存使用達到一定比例,全局并發(fā)標記階段 就會被啟動等等)
候選者:沒錯,這些都是因地制宜,具體問題具體分析(前提是得懂JVM的各種基礎知識,基礎知識都不懂,談何調(diào)優(yōu))
候選者:在大多數(shù)場景下,JVM 已經(jīng)能夠達到「開箱即用」
面試官:確實
候選者:一般我們是「遇到問題」之后才進行調(diào)優(yōu)的,而遇到問題后需要利用各種的「工具」進行排查
候選者:1. 通過jps命令查看Java進程「基礎」信息(進程號、主類)。這個命令很常用的就是用來看當前服務器有多少Java進程在運行,它們的進程號和加載主類是啥
候選者:2. 通過jstat命令查看Java進程「統(tǒng)計類」相關的信息(類加載、編譯相關信息統(tǒng)計,各個內(nèi)存區(qū)域GC概況和統(tǒng)計)。這個命令很常用于看GC的情況
候選者:3. 通過jinfo命令來查看和調(diào)整Java進程的「運行參數(shù)」。
候選者:4. 通過jmap命令來查看Java進程的「內(nèi)存信息」。這個命令很常用于把JVM內(nèi)存信息dump到文件,然后再用MAT( Memory Analyzer tool 內(nèi)存解析工具)把文件進行分析
候選者:5. 通過jstack命令來查看JVM「線程信息」。這個命令用常用語排查死鎖相關的問題
候選者:6. 還有近期比較熱門的Arthas(阿里開源的診斷工具),涵蓋了上面很多命令的功能且自帶圖形化界面。這也是我這邊常用的排查和分析工具
面試官:嗯...好吧。之前聊JVM的時候,你也提到過在「解釋」階段,會有兩種方式把字節(jié)碼信息解釋成機器指令碼,一個是字節(jié)碼解釋器、一個是即時編譯器(JIT)
面試官:我想問問,你了解JVM的JIT優(yōu)化技術嘛?
候選者:JIT優(yōu)化技術比較出名的有兩種:方法內(nèi)聯(lián)和逃逸分析
候選者:所謂方法內(nèi)聯(lián)就是把「目標方法」的代碼復制到「調(diào)用的方法」中,避免發(fā)生真實的方法調(diào)用
候選者:因為每次方法調(diào)用都會生成棧幀(壓棧出棧記錄方法調(diào)用位置等等)會帶來一定的性能損耗,所以「方法內(nèi)聯(lián)」的優(yōu)化可以提高一定的性能
候選者:在JVM中也有相關的參數(shù)給予我們指定(-XX:MaxFreqInlineSize、-XX:MaxInlineSize)
候選者:而「逃逸分析」則是判斷一個對象是否被外部方法引用或外部線程訪問的分析技術,如果「沒有被引用」,就可以對其進行優(yōu)化,比如說:
候選者:1. 鎖消除(同步忽略):該對象只在方法內(nèi)部被訪問,不會被別的地方引用,那么就一定是線程安全的,可以把鎖相關的代碼給忽略掉
候選者:2. 棧上分配:該對象只會在方法內(nèi)部被訪問,直接將對象分配在「?!怪校↗ava默認是將對象分配在「堆」中,是需要通過JVM垃圾回收期進行回收,需要損耗一定的性能,而棧內(nèi)分配則快很多)
候選者:3. 標量替換/分離對象:當程序真正執(zhí)行的時候可以不創(chuàng)建這個對象,而直接創(chuàng)建它的成員變量來代替。將對象拆分后,可以分配對象的成員變量在?;蚣拇嫫魃希镜膶ο缶蜔o需分配內(nèi)存空間了
候選者:不過扯了這么多,不同的JVM版本對JIT的優(yōu)化都不太相同(:這里也只能算是一個參考
面試官:懂了。
建議閱讀資料:【美團技術博客】Java中9種常見的CMS GC問題分析與解決
歡迎關注我的微信公眾號【Java3y】來聊聊Java面試,對線面試官系列持續(xù)更新中!
【對線面試官-移動端】系列 一周兩篇持續(xù)更新中!
【對線面試官-電腦端】系列 一周兩篇持續(xù)更新中!
原創(chuàng)不易??!求三連!!
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/125375.html
本文是公眾號讀者jianfeng投稿的面試經(jīng)驗恭喜該同學成功轉型目錄:毅然轉型,沒頭蒼蠅制定目標,系統(tǒng)學習面試經(jīng)歷毅然轉崗,沒頭蒼蠅首先,介紹一下我的背景。本人坐標廣州,2016年畢業(yè)于一個普通二本大學,曾經(jīng)在某機構培訓過Android。2018年初的時候已經(jīng)在兩家小公司工作干了兩年的android開發(fā),然后會一些Tomcat、Servlet之類的技術,當時的年薪大概也就15萬這樣子。由于個人發(fā)展...
摘要:到底什么是閉包這個問題在面試是時候經(jīng)常都會被問,很多小白一聽就懵逼了,不知道如何回答好。上面這么說閉包是一種特殊的對象。閉包的注意事項通常,函數(shù)的作用域及其所有變量都會在函數(shù)執(zhí)行結束后被銷毀。從而使用閉包模塊化代碼,減少全局變量的污染。 閉包,有人說它是一種設計理念,有人說所有的函數(shù)都是閉包。到底什么是閉包?這個問題在面試是時候經(jīng)常都會被問,很多小白一聽就懵逼了,不知道如何回答好。這個...
摘要:面試官聊下的分片集群,先聊好咯面試官是才有的官方集群方案,這塊你了解多少候選者嗯,要不還是從基礎講起唄候選者在前面聊的時候,提到的都是單實例存儲所有的數(shù)據(jù)。面試官:聊下Redis的分片集群,先聊 Redis Cluster好咯? 面試官:Redis Cluser是Redis 3.x才有的官方集群方案,這塊你了解多少? 候選者:嗯,要不還是從基礎講起唄? 候選者:在前面聊Re...
摘要:基礎回答的好百度說實話沒想到百度會給我打面試電話,畢竟是,在我心中地位還是很高的。后來第二天就通知我說直接過了,不用二三面了,就這樣只面了一面稀里糊涂的過了百度。差不多是這些,因為是米粉所以毫不猶豫的接收了小米,沒去百度。 ----------5月5日確認收到阿里offer ----------4月12日昨天阿里HR面完,目前在等結果的階段,無論結果如何都能接收,作為一名雙非學校的本科...
閱讀 3981·2023-01-11 11:02
閱讀 4487·2023-01-11 11:02
閱讀 3365·2023-01-11 11:02
閱讀 5386·2023-01-11 11:02
閱讀 4947·2023-01-11 11:02
閱讀 5877·2023-01-11 11:02
閱讀 5562·2023-01-11 11:02
閱讀 4382·2023-01-11 11:02