JVM垃圾回收問答
阿新 • • 發佈:2018-09-12
一個 效果 內存 並行 不必要 復制 常量 執行 引用
為什麽要有垃圾回收
內存資源是有限的,當所需內存不能滿足時,需要把不再使用的對象清除掉,否則JVM將無法運行下去
怎麽判斷對象是否是垃圾
判斷對象是否是垃圾,有兩種方式:1是標記引用計數,2是根部可達,第一種存在環形引用問題,第二種是JVM目前采用的方式
在根部可達中,哪些對象可以作為根
1棧中引用的對象,2方法區變量,3方法區常量,4JNDI中引用的對象
垃圾回收的方式有哪些,以及各自的優缺點
1復制:適用於大部分對象都不再引用
2 標記清除:效率相對低,容易產生碎片
3標記清除整理:效率相對低,不會產生碎片
4並發標記清除:產生碎片,效率相對高些,減少業務暫停時間
是不是內存分配的越大,效果就越好
對於需要減少暫停業務,內存分配的越大,垃圾回收的時間就越長,業務暫停時間就越長
對於需要充分發揮吞吐量的業務,內存分配的大,垃圾回收時間隨長,但整體效率要高
內存分配是一個不斷調整、觀察的過程,不是一蹴而就、一成不變的
為什麽要分代
由於存在大部分對象存活時間都很短,根據不同對象存活時間分割在不通區域,提高回收效率,降低回收時間
新生代為什麽要有Eden、S0、S1,而不采用兩個大小一樣的內存分配區域
增加內存空間率用率,減少垃圾回收次數
有什麽途徑來優化垃圾回收
對應用造成卡頓的主要來自於老年代的回收,對程序開發者來說,減少不必要的對象的創建,對於JVM可以使用並行垃圾回收和CMS(並發標記清除)收回器;
對於非逃逸對象,可以采用棧來進行存儲,減少垃圾回收次數;
對於垃圾回收,還需要進行內存分配參數的調整,這是一個長時間觀察和不斷改變的過程。
棧和堆有什麽區別
棧:先進後出,堆:先進先出
棧:存儲在一級緩存或者二級緩存上,堆:存儲在內存上
棧:存儲的是cpu要執行的指令和數據,堆:只存儲數據
棧:存儲空間較小,價格相對貴一些,堆:存儲空間大,價格相對便宜
為什麽不把所有的非逃逸對象分配到棧上
棧:存儲空間較小,價格相對貴一些
JVM垃圾回收問答