失效鏈接處理 |
Java面試題原理和底層 PDF 下載 本站整理下載:
提取碼:085g
相關截圖: ![]() 主要內容: 1. HashSet底層原理 基于HashMap實現的,HashSet底層使用HashMap來保存所有元素,hashset實現簡單,hashset操作是調用底層hashmap的方法。默認初始一個容量未16負載因子為0.75的hashmap。 https://www.iteye.com/blog/zhangshixi-673143 2. HashMap底層原理 HashMap是基于哈希表的Map接口的非同步實現。 允許使用null值和null鍵。無序。 HashMap數據結構“數組+鏈表+紅黑樹”。 3. synchronized底層如何實現?鎖優化,怎么優化? synchronized 是Java內建的同步機制,提供了互斥的語義和可見性,當一個線程已經獲取當前鎖時,其他試圖獲取的線程只能等待或者阻塞在那里。 原理: synchronized可以保證方法或者代碼塊在運行時,同一時刻只有一個方法可以進入到臨界區,同時它還可以保證共享變量的內存可見性 底層實現: 同步代碼塊是使用monitorenter和monitorexit指令實現的, ,當且一個monitor被持有之后,將處于鎖定狀態。線程執行到monitorenter指令時,將會嘗試獲取對象所對應的monitor所有權,即嘗試獲取對象的鎖; Java對象頭和monitor是實現synchronized的基礎! synchronized存放的位置:synchronized用的鎖是存在Java對象頭里的。 Java對象頭包括: Mark Word(標記字段): 用于存儲對象自身的運行時數據, 如哈希碼(HashCode)、GC分代年齡、鎖狀態標志、線程持有的鎖、偏向線程 ID、偏向時間戳等等。它是實現輕量級鎖和偏向鎖的關鍵 Klass Pointer(類型指針): 是對象指向它的類元數據的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例 monitor: 可以把它理解為一個同步工具, 它通常被描述為一個對象。 是線程私有的數據結構 4. ConcurrentHashMap 的工作原理,底層原理(談到多線程高并發大幾率會問它) 5. JVM調優(JVM層層漸進問時大幾率問) 查看堆空間大小分配(年輕代、年老代、持久代分配) 垃圾回收監控(長時間監控回收情況) 線程信息監控:系統線程數量 線程狀態監控:各個線程都處在什么樣的狀態下 線程詳細信息:查看線程內部運行情況,死鎖檢查 CPU熱點:檢查系統哪些方法占用了大量CPU時間 內存熱點:檢查哪些對象在系統中數量最大 jvm問題排查和調優: jps主要用來輸出JVM中運行的進程狀態信息。 jstat命令可以用于持續觀察虛擬機內存中各個分區的使用率以及GC的統計數據 jmap可以用來查看堆內存的使用詳情。 jstack可以用來查看Java進程內的線程堆棧信息。 jstack是個非常好用的工具,結合應用日志可以迅速定位到問題線程。 Java性能分析工具 jdk會自帶JMC(JavaMissionControl)工具。可以分析本地應用以及連接遠程ip使用。提供了實時分析線程、內存,CPU、GC等信息的可視化界面。 JVM內存調優 對JVM內存的系統級的調優主要的目的是減少GC的頻率和Full GC的次數。 過多的GC和Full GC是會占用很多的系統資源(主要是CPU),影響系統的吞吐量。 使用JDK提供的內存查看工具,比如JConsole和Java VisualVM。 導致Full GC一般由于以下幾種情況: 舊生代空間不足 調優時盡量讓對象在新生代GC時被回收、讓對象在新生代多存活一段時間和不要創建過大的對象及數組避免直接在舊生代創建對象 新生代設置過小 一是新生代GC次數非常頻繁,增大系統消耗;二是導致大對象直接進入舊生代,占據了舊生代剩余空間,誘發Full GC 2). 新生代設置過大 一是新生代設置過大會導致舊生代過小(堆總量一定),從而誘發Full GC;二是新生代GC耗時大幅度增加 3). Survivor設置過小 導致對象從eden直接到達舊生代 4). Survivor設置過大 導致eden過小,增加了GC頻率 一般說來新生代占整個堆1/3比較合適 GC策略的設置方式 1). 吞吐量優先 可由-XX:GCTimeRatio=n來設置 2). 暫停時間優先 可由-XX:MaxGCPauseRatio=n來設置 JVM內存管理,JVM的常見的垃圾收集器,GC調優 |