摘要:在用 C 之類的編程語言時,程序員須要本身手動分配和釋放內存。而 Java 不同,它有垃圾回收器,釋放內存由回收器負責。本文接下來將介紹Java垃圾收集的知識原理。
Q: Java虛擬機規範將JVM虛擬機所管理的內存分爲幾部分?若是是多選題,估計會給一些不在裏面的,例如直接內存。java
A:程序計數器、java虛擬機棧、本地方法棧、方法區、堆。程序員
java對象在內存上的分配:算法
Q:java使用根搜索算法來肯定對象是否存貨,哪些對象能夠做爲GC Roots?
A:編程
Q: 標記清除、標記整理、複製算法哪一個塊?
A: 複製算法較快。服務器
3個算法含義以下:jvm
Q: SerialOld用的是什麼算法?
A: 標記整理算法,屬於處理老年代算法。
各收集器的變化圖以下,主要關注一下變化和區別,編程語言
Q: fullGC 會發生在老年代區仍是新生代區?
A: 會發生在老年代區。 相反,minorGC通常發送在新生代區。
新生代、老生代以及minorGC、fullGC的發生流程以下:性能
Q: 方法區裏的class對象(即類對象)何時會被回收?
A: 全部實例都被回收、對應classLoader也被回收、class對象不會再被引用或者反射(這個咋肯定?當初書裏看到的,沒懂)學習
Q: 何時會調用對象的finalized方法
A: JVM啓動垃圾回收,且該對象要被回收時。spa
finalized應該更可能是規範吧,不少規範裏都要求咱們不要本身實現finalized了,畢竟不肯定性太大。
忽然想起來當初看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問題。
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 。