內存溢出 out of memory,是指程序在申請內存時,沒有足夠的內存空間供其使用,出現out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就是內存溢出。
內存泄露 memory leak,是指程序在申請內存後,無法釋放已申請的內存空間,一次內存泄露危害可以忽略,但內存泄露堆積後果很嚴重,無論多少內存,遲早會被佔光。其實說白了就是該內存空間使用完畢之後未回收。
GC的基本概念
gc分爲full gc 跟 minor gc(Young GC也就是Minor GC),當每一塊區滿的時候都會引發gc。
-
Scavenge GC
一般情況下,當新對象生成,並且在Eden申請空間失敗時,就觸發了Scavenge GC,堆Eden區域進行GC,清除非存活對象,並且把尚且存活的對象移動到Survivor區。然後整理Survivor的兩個區。 -
Full GC
對整個堆進行整理,包括Young、Tenured和Perm。Full GC比Scavenge GC要慢,因此應該儘可能減少Full GC。有如下原因可能導致Full GC:
-
上一次GC之後Heap的各域分配策略動態變化
-
System.gc()被顯示調用
-
Perm域(永久代)被寫滿
-
old 代被寫滿