1. 程式人生 > >Java後臺開發面試題總結

Java後臺開發面試題總結

情況 swap sql 行數 his 本地方法棧 特性 jndi buffer

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性能提升也主要依賴它。

Java後臺開發面試題總結