摘要:在用 C 之類的編程語言時,程式員需要自己手動分配和釋放記憶體,而 Java 不一樣,它有垃圾回收器,釋放記憶體由回收器負責,本文接下來將介紹Java垃圾收集的知識原理,
java記憶體區域
Q: Java虛擬機規范將JVM虛擬機所管理的記憶體分為幾部分?如果是多選題,估計會給一些不在里面的,例如直接記憶體,
A:程式計數器、java虛擬機堆疊、本地方法堆疊、方法區、堆,

java物件在記憶體上的分配:

§ GC策略
Q:java使用根搜索演算法來確定物件是否存貨,哪些物件可以作為GC Roots?
A:
- 虛擬機堆疊(堆疊幀中的本地變數表)中的參考的物件
- 方法區中的類靜態屬性參考的物件
- 方法區中的常量參考的物件
- 本地方法堆疊中JNI(Native方法)的參考物件
Q: 標記清除、標記整理、復制演算法哪個塊?
A: 復制演算法較快,
3個演算法含義如下:

Q: SerialOld用的是什么演算法?
A: 標記整理演算法,屬于處理老年代演算法,
各收集器的變化圖如下,主要關注一下變化和區別,


Q: fullGC 會發生在老年代區還是新生代區?
A: 會發生在老年代區, 相反,minorGC一般發送在新生代區,
新生代、老生代以及minorGC、fullGC的發生流程如下:

Q: 方法區里的class物件(即類物件)什么時候會被回收?
A: 所有實體都被回收、對應classLoader也被回收、class物件不會再被參考或者反射(這個咋確定?當初書里看到的,沒懂)
§ finalized與GC
Q: 什么時候會呼叫物件的finalized方法
A: JVM啟動垃圾回收,且該物件要被回收時,
finalized應該更多是規范吧,很多規范里都要求我們不要自己實作finalized了,畢竟不確定性太大,
§ Java虛擬機GC引數配置
突然想起來當初看java虛擬機時,把那些引數給跳過了,感覺記不住,
但現在發現還是得學的,趕緊惡補一下,
Q:
-client和-server的對比
()啟動較快
()性能和記憶體管理效率高(注意啟動快和性能好不是一回事)
桌面應用一般使用(), 服務器一般使用()
A:
(-clien)啟動較快
(-server)性能和記憶體管理效率高
桌面應用一般使用(-clien), 服務器一般使用(-server)
有4個跟記憶體相關的引數
-Xmn -Xms -Xmx -Xss
回答下面的問題:
Q:
用于配置java初始堆記憶體的是()
A:
-Xms,
-X、memory、size ,記憶體大小
Q:
用于配置java堆的最大值的是()
A:
-Xmx,
-X、memory、max
最大記憶體

Q:如果不設定,-Xms和-Xmx的大小分別默認是多少?
A:
不設定的話,二者相等,默認是 物理記憶體/64(小于1G)
Q:用于配置新生代記憶體大小的最大值是:()
你問我什么是新生代記憶體?
就是下面這個,1個E區加2個S區的這個記憶體大小
A:
-Xmn,
-X、memory、new
相類似的還有-XX:NewSize 和 -XX:MaxNewSize,
Q: 如何根據上面的引數計算老年代記憶體大小?
A:
Xmx的值(堆最大值)- Xmn的值(新生代記憶體)
Q: 用于配置執行緒堆疊記憶體的是()? 替代的還有哪個引數?
A:
-Xss, 另一個是-XX:ThreadStackSize
-Xss指 -X stack size
有下面3個和gc相關的引數
-Xnoclassgc -Xincgc -Xloggc:file
回答以下問題:
Q:
可用于關閉針對類物件的gc功能的是()
可用于減少gc的程式停頓時間的是()
用于輸出gc相關日志的是()
A:
可用于關閉針對類物件的gc功能的是(-Xnoclassgc)
可用于減少gc的程式停頓時間的是(-Xincgc)
用于輸出gc相關日志的是(-Xloggc:file)
Q:-verbose 一般是用于什么的?
A:
查詢gc問題,
- -verbose:class 輸出jvm載入類的相關資訊,當jvm報告說找不到類或者類沖突時可此進行診斷,
- -verbose:gc 輸出每次GC的相關情況,后面會有更詳細的介紹,
- -verbose:jni 輸出native方法呼叫的相關情況,一般用于診斷jni呼叫錯誤資訊,
Q: -XX:PermSize和-XX:MaxPermSize設定的是什么記憶體?
A:
方法區的記憶體,就是最開始那個圖里的這個

通過配置-XX:PermSize以及-XX:MaxPermSize來控制這塊記憶體的大小,jvm在啟動的時候會根據-XX:PermSize初始化分配一塊連續的記憶體塊,這樣的話,如果-XX:PermSize設定過大,可能會很浪費,而Max如果設定小了,可能會omm,
Q:-XX:MetaspaceSize和-XX:MaxMetaspaceSize又是什么記憶體?
A:
元資料區記憶體, java8引入的,用于替代上面的perm區,
無論-XX:MetaspaceSize和-XX:MaxMetaspaceSize兩個引數如何設定,隨著類加載越來越多不斷擴容調整,直到MetaspaceSize(如果沒有配置就是默認20.8m)觸發FGC,上限是-XX:MaxMetaspaceSize,默認是幾乎無窮大
本文分享自華為云社區《Java云服務開發知識學習之 java垃圾收集》,原文作者:breakDraw ,
點擊關注,第一時間了解華為云新鮮技術~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/242001.html
標籤:java
下一篇:Stream流由淺到深
