三、JVM
1.JVM堆的基本結構。
堆可以細分為:新生代(Young Generation ) 和老年代(Tenured Generation) ;
也可分為: Eden空間,From Survivor 空間、 To Survivor空間;
2.JVM的垃圾算法有哪幾種?CMS垃圾回收的基本流程?
- 引用計數法(簡單高效,但是無法處理循環引用,jvm中不采用)
- 可達性分析算法
- 標記清除算法
- 復制算法
- 標記整理算法
CMS(Concurrent Mark Sweep)基本流程:
- 初始標記
- 并發標記
- 重新標記
- 并發清除
3.JVM有哪些常用啟動參數可以調整,描述幾個?
參數名 | 使用說明 |
---|---|
Xms | 設置 Java 堆的初始化大小 |
Xmx | 設置 Java 堆最大值大小 |
Xss | 設置Java虛擬機棧大小 |
Xmn | 設置年輕代大小 |
-XX:PermSize | 設置持久代(perm gen)初始值 |
-XX:MaxPermSize | 設置持久代最大值 |
4.如何查看JVM的內存使用情況?
在jdk的bin目錄下有
jstat.exe jconsole.exe jvisualvm.exe 等工具可以查看內存狀況
5.Java程序是否會內存溢出,內存泄露情況發生?舉幾個例子。
創建一個大數組就會內存溢出:long[] arr=new long[102410241024];
不關資源,比如數據庫連接,打開的文件等,就會出現內存泄漏。
6.你常用的JVM配置和調優參數都有哪些?分別什么作用?
參考第3題
7.JVM的內存結構?
由所有線程共享:方法區,堆。
線程隔離的數據區: 虛擬機棧,本地方法棧,程序計數器。
8.常用的GC策略,什么時候會觸發YGC,什么時候觸發FGC?
設置安全點,安全區域。
JVM的YGC&FGC
YGC :對新生代堆進行GC。頻率比較高,因為大部分對象的存活壽命較短,在新生代里被回收。性能耗費較小。
FGC :全堆范圍的GC。默認堆空間使用到達80%(可調整)的時候會觸發FGC。以我們生產環境為例,一般比較少會觸發FGC,有時10天或一周左右會有一次。
對YGC的 觸發時機,相當的顯而易見,就是eden空間不足, 這時候就肯定會觸發ygc
對于FGC的觸發時機, old空間不足, 和perm的空間不足, 調用system.gc()這幾個都比較顯而易見,就是在這種情況下, 一般都會觸發GC。
目錄列表
一、數據結構與算法基礎
二、Java基礎
三、JVM
四、多線程/并發
五、Linux使用與問題分析排查
六、框架使用
七、數據庫相關
八、網絡協議和網絡編程
九、Redis等緩存系統/中間件/NoSQL/一致性Hash等
十、設計模式與重構
本文是針對知乎文章《成為Java頂尖程序員,先過了下面問題》的解答