如果JVM裡運行的程序
它的內存堆和持久存儲區域的都滿了
這個時候程序還想創建對象實例的話
垃圾收集器就會啟動
試圖釋放足夠的內存來創建這個對象
這個時候如果垃圾收集器 沒有能力釋放出足夠的內存
它就會拋出OutOfMemoryError內存溢出錯誤
SUN JVM的內存管理方式
SUN的JVM是類似人類家族
也就是在一個地方創建對象
在它長期占據空間之前給它多次死亡的機會
SUN JVM會劃分為
年輕的一代(Young generation)
包括EDEN和
個幸存者空間(出發地和目的地the From space and the To space)
老一代(Old generation)
永久的一代(Permanent generation)
Java虛擬機的運行時數據區一般分類如下(不一定是物理劃分)
堆
主要存放對象實例
線程共享
棧
主要存儲特定線程的方法調用狀態
線程獨占
本地方法棧
存儲本地方法的調用狀態
線程獨占
PC寄存器
學過操作系統課程的都知道
線程獨占
方法區
主要存儲了類型信息
線程共享
因此
在拋出內存溢出錯誤的時候
一般都會提示內存洩露的種類
一般也都是按照區域進行劃分
堆(heap)內存洩漏java
lang
OutOfMemoryError: Javaheap space:大家都比較熟悉
通過設置
Xms
m
Xmx
m可以解決
棧(stack)內存洩漏
當前線程運行期間維護的中間變量等信息過多
例如常見的死循環引起stack over flow
方法區(permanent heap)內存洩漏
即java
lang
OutOfMemoryError: PermGen space:發生的原因和類型裝載
類型卸載有直接的關系
通過設置
XX:MaxNewSize=
m
XX:MaxPermSize=
m可以解決
一般情況下
當服務器內存過小
而提供了大量的訪問服務時
可能會緩存過多的數據對象造成堆內存溢出
當web應用不斷擴大
加載的lib庫達到一定大小(
M)後
就容易報PermGen OOM
也就是方法區溢出
在Linux服務器中將參數寫入環境變量
export CATALINA_OPTS=
Xms
m
Xmx
m
export JAVA_OPTS=
XX:MaxNewSize=
m
XX:MaxPermSize=
m
Xmx 最大不要超過服務器物理內存的
%
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27937.html