JVM中的記憶體和計算機的記憶體不是一回事,JVM(JAVA虛擬機器)只是執行在伺服器中的一個程序,只佔用一部分的記憶體,其中堆通常佔了整個jvm記憶體的80%!
假設一下,計算機是8G記憶體只給jvm分配了4G記憶體,jvm佔用了4G記憶體之後,雖然整個記憶體才使用50%(忽略其他的),jvm也將發生記憶體溢位!
jvm記憶體溢位有哪些可能情況呢?
①,堆溢位:堆用來儲存例項物件!
可能原因一:設定的最大堆記憶體太小!解決方案:透過設定-Xmx調大最大堆記憶體!
可能原因二:迴圈建立物件導致物件來不及回收!解決方案:最佳化程式碼!
②,棧溢位:棧主要用來存放物件引用!
可能原因:遞迴呼叫方法等容易出現棧溢位!
解決方法:最佳化程式碼!
通常不會溢位,使用-XX:Permsize設定合適的永久代!
發現記憶體溢位之後,可使用jstamp,MAT JAVA等進行記憶體分析
一直在持續分享JAVA方面的技術,有需要的朋友敬請關注。。
JVM中的記憶體和計算機的記憶體不是一回事,JVM(JAVA虛擬機器)只是執行在伺服器中的一個程序,只佔用一部分的記憶體,其中堆通常佔了整個jvm記憶體的80%!
假設一下,計算機是8G記憶體只給jvm分配了4G記憶體,jvm佔用了4G記憶體之後,雖然整個記憶體才使用50%(忽略其他的),jvm也將發生記憶體溢位!
jvm記憶體溢位有哪些可能情況呢?
①,堆溢位:堆用來儲存例項物件!
可能原因一:設定的最大堆記憶體太小!解決方案:透過設定-Xmx調大最大堆記憶體!
可能原因二:迴圈建立物件導致物件來不及回收!解決方案:最佳化程式碼!
②,棧溢位:棧主要用來存放物件引用!
可能原因:遞迴呼叫方法等容易出現棧溢位!
解決方法:最佳化程式碼!
通常不會溢位,使用-XX:Permsize設定合適的永久代!
發現記憶體溢位之後,可使用jstamp,MAT JAVA等進行記憶體分析
一直在持續分享JAVA方面的技術,有需要的朋友敬請關注。。