JVM之總結與常見問題思考

1.JVM 整體性能優化

1.先是發現問題,使用工具排查問題,提供解決方案

在這裏插入圖片描述

2.常見問題思考

2.1.內存泄漏與內存溢出的區別

內存泄漏:對象無法得到及時的回收,持續佔用內存空間,從而造成內存空間的浪費。
內存溢出:內存泄漏到一定的程度就會導致內存溢出,但是內存溢出也有可能是大對象導致的。

2.2.young gc會有stw嗎?

不管什麼 GC,都會有 stop-the-world,只是發生時間的長短。

2.3.major gc和full gc的區別

major gc指的是老年代的gc,而full gc等於young+old+metaspace的gc。

2.4.G1與CMS的區別是什麼

CMS 用於老年代的回收,而 G1 用於新生代和老年代的回收。
G1 使用了 Region 方式對堆內存進行了劃分,且基於標記整理算法實現,整體減少了垃圾碎片的產生。

2.5.什麼是直接內存

直接內存是在java堆外的、直接向系統申請的內存空間。通常訪問直接內存的速度會優於Java堆。因此出於性能的考慮,
讀寫頻繁的場合可能會考慮使用直接內存。

2.6.不可達的對象一定要被回收嗎?

即使在可達性分析法中不可達的對象,也並非是“非死不可”的,這時候它們暫時處於“緩刑階段”,要真正宣告一個對象死亡,至少要經歷兩次標記過程;
可達性分析法中不可達的對象被第一次標記並且進行一次篩選,篩選的條件是此對象是否有必要執行 finalize 方法。
當對象沒有覆蓋 finalize 方法,或 finalize 方法已經被虛擬機調用過時,虛擬機將這兩種情況視爲沒有必要執行。
被判定爲需要執行的對象將會被放在一個隊列中進行第二次標記,除非這個對象與引用鏈上的任何一個對象建立關聯,否則就會被真的回收。

2.7.方法區中的無用類回收

方法區主要回收的是無用的類,那麼如何判斷一個類是無用的類的呢?
判定一個常量是否是“廢棄常量”比較簡單,而要判定一個類是否是“無用的類”的條件則相對苛刻許多。類需要同時滿足下面 3 個條件才能算是 “無用的類” :
該類所有的實例都已經被回收,也就是 Java 堆中不存在該類的任何實例。加載該類的 ClassLoader 已經被回收。
該類對應的 java.lang.Class 對象沒有在任何地方被引用,無法在任何地方通過反射訪問該類的方法。
虛擬機可以對滿足上述 3 個條件的無用類進行回收,這裏說的僅僅是“可以”,而並不是和對象一樣不使用了就會必然被回收。

2.8.不同的引用

JDK1.2以後,Java對引用進行了擴充:強引用、軟引用、弱引用和虛引用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章