1. 程式人生 > >JVM垃圾回收問答

JVM垃圾回收問答

一個 效果 內存 並行 不必要 復制 常量 執行 引用

為什麽要有垃圾回收

內存資源是有限的,當所需內存不能滿足時,需要把不再使用的對象清除掉,否則JVM將無法運行下去

怎麽判斷對象是否是垃圾

判斷對象是否是垃圾,有兩種方式:1是標記引用計數,2是根部可達,第一種存在環形引用問題,第二種是JVM目前采用的方式

在根部可達中,哪些對象可以作為根

1棧中引用的對象,2方法區變量,3方法區常量,4JNDI中引用的對象

垃圾回收的方式有哪些,以及各自的優缺點

1復制:適用於大部分對象都不再引用

2 標記清除:效率相對低,容易產生碎片

3標記清除整理:效率相對低,不會產生碎片

4並發標記清除:產生碎片,效率相對高些,減少業務暫停時間

是不是內存分配的越大,效果就越好

對於需要減少暫停業務,內存分配的越大,垃圾回收的時間就越長,業務暫停時間就越長

對於需要充分發揮吞吐量的業務,內存分配的大,垃圾回收時間隨長,但整體效率要高

內存分配是一個不斷調整、觀察的過程,不是一蹴而就、一成不變的

為什麽要分代

由於存在大部分對象存活時間都很短,根據不同對象存活時間分割在不通區域,提高回收效率,降低回收時間

新生代為什麽要有Eden、S0、S1,而不采用兩個大小一樣的內存分配區域

增加內存空間率用率,減少垃圾回收次數

有什麽途徑來優化垃圾回收

對應用造成卡頓的主要來自於老年代的回收,對程序開發者來說,減少不必要的對象的創建,對於JVM可以使用並行垃圾回收和CMS(並發標記清除)收回器;

對於非逃逸對象,可以采用棧來進行存儲,減少垃圾回收次數;

對於垃圾回收,還需要進行內存分配參數的調整,這是一個長時間觀察和不斷改變的過程。

棧和堆有什麽區別

棧:先進後出,堆:先進先出

棧:存儲在一級緩存或者二級緩存上,堆:存儲在內存上

棧:存儲的是cpu要執行的指令和數據,堆:只存儲數據

棧:存儲空間較小,價格相對貴一些,堆:存儲空間大,價格相對便宜

為什麽不把所有的非逃逸對象分配到棧上

棧:存儲空間較小,價格相對貴一些

JVM垃圾回收問答