首頁>技術>

​摘要:在用 C 之類的程式語言時,程式設計師需要自己手動分配和釋放記憶體。而 Java 不一樣,它有垃圾回收器,釋放記憶體由回收器負責。本文接下來將介紹Java垃圾收集的知識原理。

在用C 之類的程式語言時,程式設計師需要自己手動分配和釋放記憶體。而Java 不一樣,它有垃圾回收器,釋放記憶體由回收器負責。本文接下來將介紹Java垃圾收集的知識原理。

java記憶體區域

Q; Java虛擬機器規範將JVM虛擬機器所管理的記憶體分為幾部分?如果是多選題,估計會給一些不在裡面的,例如直接記憶體。A:程式計數器、java虛擬機器棧、本地方法棧、方法區、堆。

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

GC策略

Q:java使用根搜尋演算法來確定物件是否存貨,哪些物件可以作為GC Roots?

A:

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

Q: 標記清除、標記整理、複製演算法哪個塊?A: 複製演算法較快。3個演算法含義如下:

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 stacksize

有下面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,預設是幾乎無窮大。

15
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 資料庫:SQLServer分頁查詢整理