Java后台開發面試題總結


1>如何定位線上服務OOM問題 

2>JVM的GC ROOTS存在於那些地方

3>mysql innodb怎樣做查詢優化

4>java cas的概念

 

Java服務OOM,比較常見的原因是

⭐️ 有可能是內存分配確實過小,而正常業務使用了大量內存 比如jmp -heap命令可以查看新生帶,老年代內存大小的情況。看看內存本身是否分配過小。

⭐️ 某一個對象被頻繁申請,卻沒有釋放,內存不斷泄漏,導致內存耗盡 ,比如jmap -histo:live 對象顯示存活對象的信息,並按照所占內存大小的排序。因為包含了實例數、所占         內存大小、類名,所以很直觀。

⭐️ 某一個資源被頻繁申請,系統資源耗盡,例如:不斷創建線程,不斷發起網絡連接

 

2>JVM的GC ROOTS存在於那些地方、

 問到這個問題應該是前面一步步引導過來的,如果沒有,在直接回答這個問題之前,最好簡要描述一下JVM的內存結構和根搜索算法(GC ROOTS Tracing)做可達性分析。

⭐️  虛擬機棧(棧楨中的本地變量表)中的引用的對象

⭐️  方法區中的類靜態屬性引用的對象

⭐️  方法區中的常量引用的對象

⭐️  本地方法棧中JNI的引用的對象

       Gc管理的主要的區域是java堆,一般情況只針對堆進行垃圾回收。方法區,棧,和本地方法區不被Gc所管理,因而選擇這些區域作為GC  ROOTS ,被GC  ROOTS引用的不會 

      被垃圾回收。

 

mysql innodb怎樣做查詢優化

⭐️  innodb_buffer_pool_size 此參數的作用是緩沖數據和索引,對性能可以產生線性的提高,最大可設置為內存大小的百分之七八十的樣子

⭐️  打開慢查詢日志,增加參數:log-queries-not-using-indexes,方便把系統中沒有走索引的sql語句全抓出來優化

⭐️  通過explain做查詢分析,看看有沒有用索引,訪問的行數rows

⭐️  關閉skip_name_resolve,減少逆向DNS解析的消耗

另外還有一些實際寫代碼過程中深入骨髓的,比如數據動靜分離提高query_cache的命中率啦,減少字段冗余,減少查詢次數啦,復雜查詢分解啦,分頁優化啦啥的。

 

4>java cas的概念

cas:compare and swap,比較並交換 

java的concurrent包中借助cas實現了區別於synchronized同步鎖的一種樂觀鎖。

CAS利用CPU的CAS指令,同時借用JNDI來完成java的非阻塞算法,其他的原子操作都是利用類似的特性完成的。java的concurrent包相對於使用synchronized性能提升也主要依賴它。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM