jdk outMemory內存溢出


 

參數的含義:
-vmargs -Xms256M -Xmx768M -Xss256k -XX:PermSize=256M -XX:MaxPermSize=768M
-vmargs 說明后面是vm的參數
-Xms256M jvm初始分配的堆內存,默認為物理內存的1/64,可與-Xmx設置相同,防止每次垃圾回收重新分配內存
-Xmx768M jvm最大允許分配的堆內存,默認為物理內存1/4
-Xss256k 每個線程的堆棧大小,jdk 1.5以后每個線程堆棧默認為1M
-XX:PermSize=256M jvm初始分配的非堆內存,默認為物理內存的1/64
-XX:MaxPermSize=768M jvm允許分配的最大非堆內存,默認為物理內存1/4

內存分為堆內存與非堆內存:

堆內存為Java代碼及可用的內存,是留給開發人員使用的;非堆就是JVM留給自己用的。

在JVM中如果98%的內存用於垃圾回收且可用的 Heap Size 不足 2%的時候將拋出 OutOfMemoryError 錯誤

堆內存分配:

  JVM初始分配的堆內存由Xms制定,默認是物理內存的1/64;JVM最大分配的堆內存由-Xmx指定,默認是物理內存的1/4。 默認空余堆內存小於40%時,JVM會增大堆知道Xmx的最大限制。空余堆內存大於70%時,JVM會減少到-Xms的最小限制,因此服務器設置-Xms、-Xmx 相等以避免在每次GC(垃圾回收)后調整堆的大小。
說明:如果-Xmx 不指定或者指定偏小,應用可能會導致java.lang.OutOfMemory錯誤,此錯誤來自JVM,不是Throwable的,無法用try...catch捕捉。

非堆內存分配:
  JVM使用-XX:PermSize設置非堆內存初始值,默認是物理內存的1/64;由XX:MaxPermSize設置最大非堆內存的大小,默認是物理內存的1/4。
  PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域。
  XX:MaxPermSize設置過小會導致java.lang.OutOfMemoryError: PermGen space 就是內存益出。

為什么會內存溢出:
 
  (1)飛堆內存用於存放class和mete的信息,Class在被Load的時候被放入PermGen space(內存永久區域)區域,它和存放實例的Heap區域不同。
  (2)GC(Garbage Collection:垃圾回收器)不會再主程序運行期對PermGen space進行清理,所以如果程序Load很多class的話,就有可能會出現 PermGen space錯誤。

JVM內存限制(最大值):

  首先,JVM內存限制於實際的最大物理內存,假設內存無限大的話,JVM內存的最大值跟操作系統有關,簡單說32位處理器雖然可控內存空間有4GB,但是最大也許就被先知道2GB-3GB,而64位就沒有限制。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM