垃圾回收你懂,Java垃圾回收你懂嗎?

摘要:在用 C 之類的編程語言時,程序員須要本身手動分配和釋放內存。而 Java 不同,它有垃圾回收器,釋放內存由回收器負責。本文接下來將介紹Java垃圾收集的知識原理。

java內存區域

Q: Java虛擬機規範將JVM虛擬機所管理的內存分爲幾部分?若是是多選題,估計會給一些不在裏面的,例如直接內存。java

A:程序計數器、java虛擬機棧、本地方法棧、方法區、堆。程序員

java對象在內存上的分配:算法

§ GC策略

Q:java使用根搜索算法來肯定對象是否存貨,哪些對象能夠做爲GC Roots?
A:編程

  • 虛擬機棧(棧幀中的本地變量表)中的引用的對象
  • 方法區中的類靜態屬性引用的對象
  • 方法區中的常量引用的對象
  • 本地方法棧中JNI(Native方法)的引用對象

Q: 標記清除、標記整理、複製算法哪一個塊?
A: 複製算法較快。服務器

3個算法含義以下:jvm

Q: SerialOld用的是什麼算法?
A: 標記整理算法,屬於處理老年代算法。
各收集器的變化圖以下,主要關注一下變化和區別,編程語言

Q: fullGC 會發生在老年代區仍是新生代區?
A: 會發生在老年代區。 相反,minorGC通常發送在新生代區。
新生代、老生代以及minorGC、fullGC的發生流程以下:性能

Q: 方法區裏的class對象(即類對象)何時會被回收?
A: 全部實例都被回收、對應classLoader也被回收、class對象不會再被引用或者反射(這個咋肯定?當初書裏看到的,沒懂)學習

§ finalized與GC

Q: 何時會調用對象的finalized方法
A: JVM啓動垃圾回收,且該對象要被回收時。spa

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 。

 

點擊關注,第一時間瞭解華爲雲新鮮技術~

相關文章
相關標籤/搜索