1. 程式人生 > >Java記憶體溢位問題總結

Java記憶體溢位問題總結

  使用Java那麼久,在此總結一下Java中常見的記憶體溢位問題以及對應的解決思路

堆溢位

報錯資訊

java.lang.OutOfMemoryError: Java heap space

報錯原因

  • 堆中(新生代和老年代)無法繼續分配物件了;
  • 某些物件的引用長期被持有沒有被釋放,垃圾回收器無法回收;
  • 使用了大量的 Finalizer 物件,這些物件並不在 GC 的回收週期內。

解決辦法

  • 將堆記憶體 dump 下來,使用 MAT 分析一下,解決記憶體洩漏;
  • 如果沒有記憶體洩漏,使用 -Xmx 增大堆記憶體;
  • 如果有自定義的 Finalizable 物件,考慮其存在的必要性。

GC超載溢位

報錯資訊

java.lang.OutOfMemoryError:GC overhead limit exceeded

報錯原因

垃圾回收器超過98%的時間用來做垃圾回收,但回收了不到2%的堆記憶體。

解決辦法

  • 新增 -XX:-UseGCOverheadLimit 這個啟動引數去掉報警,但這只是一種掩耳盜鈴的方式,一般出現 GC overhead limit exceeded 說明離真正的 OOM 也不遠了;
  • 將堆記憶體 dump 下來,使用 MAT 分析一下,解決記憶體洩漏;
  • 如果沒有記憶體洩漏,使用 -Xmx 增大堆記憶體;

永久代/元空間溢位

報錯資訊

java.lang.OutOfMemoryError: PermGen space 或者
java.lang.OutOfMemoryError: Metaspace(Java8及以上)

報錯原因

永久代是 HotSot 虛擬機器對 方法區的具體實現,存放了已被虛擬機器載入的類資訊、常量、靜態變數、JIT編譯後的程式碼等。需要注意的是,在Java8後,永久代有了一個新名字:元空間,元空間使用的是本地記憶體。永久代裡存在的資訊也有了若干變化:

  • 字串常量由永久代轉移到堆中;
  • 和永久代相關的JVM引數已移除。

出現永久代或元空間的溢位的原因可能有如下幾種:

  • 有頻繁的常量池操作(eg. String.intern),這種情況只適用於Java7之前應用;
  • 載入了大量的類資訊,且沒有及時解除安裝;
  • 應用部署完後沒有重啟。

解決辦法

永久代/元空間 溢位的原因比較簡單,解決方法有如下幾種:

  • Java8前的應用:使用 -XX:MaxPermSize 增加永久代的大小();
  • Java8及以後的應用:如果設定了 -XX:MaxMetaSpaceSize,調整其大小或者移除掉該引數。
  • 嘗試重啟JVM。

方法棧溢位

報錯資訊

java.lang.OutOfMemoryError : unable to create new native Thread

報錯原因

虛擬機器在拓展棧空間時,無法申請到足夠的記憶體空間。一般出現在記憶體空間過小,但是又建立了大量的執行緒的場景。

解決辦法

  • 通過-Xss降低的每個執行緒棧大小的容量,注意-Xms,-Xmx的影響;
  • 執行緒總數也受到系統空閒記憶體和作業系統的限制,檢查是否該系統下有此限制:
    • /proc/sys/kernel/pid_max,
    • /proc/sys/kernel/thread-max,
    • max_user_process(ulimit -u),
    • /proc/sys/vm/max_map_count

陣列分配溢位

報錯資訊

java.lang.OutOfMemoryError: Requested array size exceeds VM limit

這種情況一般是由於不合理的陣列分配請求導致的,消除程式碼邏輯錯誤或者調整堆大小。

Swap分割槽溢位

報錯資訊

java.lang.OutOfMemoryError: Out of swap space

這種情況一般是作業系統導致的,可能的原因有:

  • swap 分割槽大小分配不足;
  • 機器上其他程序消耗了所有的記憶體。

本地方法溢位

報錯資訊

java.lang.OutOfMemoryError: stack_trace_with_native_method

    這種情況表明,本地方法在執行時出現了記憶體分配失敗。和java.lang.OutOfMemoryError : unable to create new native Thread 儲存不同,方法棧溢位出現在 JVM 的程式碼層面,而本地方法溢位發生在JNI程式碼或本地方法處。

相關推薦

Java記憶體溢位問題總結

  使用Java那麼久,在此總結一下Java中常見的記憶體溢位問題以及對應的解決思路 堆溢位 報錯資訊 java.lang.OutOfMemoryError: Java heap space 報錯原因 堆中(新生代和老年代)無法繼續分配物件了; 某些物件的引用

java記憶體溢位的常見情況和處理方式總結

注:建議如果是面試,只用說第一部分就OK,個人見解,視情況而定。一:總結:建議面試時可以簡略說java.lang.OutOfMemoryError這個錯誤是開發中經常遇到的錯誤,產生該錯誤的原因大都出於

Java 記憶體溢位java.lang.OutOfMemoryError)的常見情況和處理方式總結

http://outofmemory.cn/c/java-outOfMemoryError java.lang.OutOfMemoryError這個錯誤我相信大部分開發人員都有遇到過,產生該錯誤的原因大都出於以下原因:JVM記憶體過小、程式不嚴密,產生了過多的垃圾。

Java 記憶體溢位java.lang.OutOfMemoryError: Java heap space)分析與解決

說明:下面出現的問題為本人在myeclips開發過程中,開發工具時獲取海量資料時出現的問題報錯。由於本人開發電腦使用的4g記憶體,虛擬記憶體與myeclips相關記憶體設定無法滿足要求。 問題分析:(網上資料整合與翻譯) java.lang.OutOfMemo

java 記憶體溢位-與gc

參考: https://www.jianshu.com/p/ddbd1e229c4c?from=groupmessage 感謝原作者 在日常中我們經常遇到這樣的錯誤:java.lang.OutOfMemoryError: Java heap space。 但是除了heap sp

常見的 Java 記憶體溢位解決方案

一、 java.lang.OutOfMemoryError: Java heap space —-JVM Heap(堆)溢位 JVM 在啟動的時候會自動設定 JVM Heap 的值,其初始空間(即-Xms)是實體記憶體的1/64,最大空間(-Xmx)不可超過實體記憶體。可以利用 JVM提

Java 記憶體溢位排查

Java OOM 毫無疑問是開發人員常見並且及其痛恨的問題,但是任何服務的開發都沒法避免 OOM。 因此,OOM 的排查及定位是每個 Java 工程師都必備的技能。 所遇到的問題 在使用 scala 開發的一個 web 服務,在使用者使用中,經常出現: java.lang.

Java記憶體溢位異常

Java堆溢位 Java堆用於儲存物件例項,只要不斷的建立物件,並且保證GC Roots到物件之間有可達路徑來避免垃圾回收機制清楚這些物件,那麼在物件數量到達最大對的容量限制後就會產生記憶體溢位異常。 package com.xrq.test; import java.

java記憶體溢位程式舉例

2.Java記憶體溢位程式舉例 OutOfMemoryError: Java heap space import java.util.ArrayList; import java.util.List;

Java記憶體溢位場景及解決辦法

       Java記憶體溢位即程式在申請記憶體時,沒有足夠的空間供其使用,出現out of memory。常見於四種情況:棧溢位(StackOverflowError)、堆溢位(OutOfMemoryError:java heap space)、永久代溢位(OutOfMe

效能測試-java記憶體溢位問題排查

背景: 最近測試一個智慧呼叫系統,就是AI代替人工客服批量給客戶打電話作推廣活動,在測試的過程中,應用伺服器和資料庫伺服器資源使用都挺正常的,但是長久不重啟應用,過個2-3天,執行個幾次同時呼叫600個電話撥打任務後,就可能存在: org.springframework

Java記憶體溢位問題

2018年11月19日 10:43:35 ┌~頂頂﹎ 閱讀數:6 個人分類: 後臺

關於JAVA記憶體溢位問題

               java.lang.OutOfMemoryError: Java heap space                  at java.util.Arrays.copyOf(Arrays.java:2786)                  at java.io.ByteAr

java記憶體溢位溢位的原因與排查方法

 1、 記憶體溢位的原因是什麼?  記憶體溢位是由於沒被引用的物件(垃圾)過多造成JVM沒有及時回收,造成的記憶體溢位。如果出現這種現象可行程式碼排查: 一)是否App中的類中和引用變數過多使用了Static修飾 如public staitc Student s;在類中的屬性中使用 static修飾的

Java記憶體溢位錯誤:OutOfMemoryError異常分析

在JVM的執行時資料區,除了程式計數器之外,其他區域都有可能會產生OutOfMemoryError異常。 Java堆溢位         Java堆溢位時會報下面的異常錯誤: java.lang.OutOfMemoryError: Java heap space 在啟動虛

java記憶體溢位分析工具:jmap使用實戰

在一次解決系統tomcat老是記憶體撐到頭,然後崩潰的問題時,使用到了jmap。1 使用命令在環境是linux+jdk1.5以上,這個工具是自帶的,路徑在JDK_HOME/bin/下jmap -histo pid>a.log2 輸出結果摘要Size    Count 

Java記憶體溢位及jvm記憶體設定

記憶體溢位型別 (1)java.lang.OutOfMemoryError: PermGen space  JVM管理兩種型別的記憶體,堆和非堆。堆是給開發人員用的上面說的就是,是在JVM啟動時建立;

java記憶體溢位和棧溢位例項以及記憶體溢位記憶體洩露的區別

記憶體溢位和記憶體洩露的區別:記憶體溢位 out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory;比如申請了一個integer,但給它存了lo

《深入理解java虛擬機器》學習筆記2——Java記憶體溢位例項

通過簡單的小例子程式,演示java虛擬機器各部分記憶體溢位情況: (1).java堆溢位: Java堆用於儲存例項物件,只要不斷建立物件,並且保證GC Roots到物件之間有引用的可達,避免垃圾收集器回收例項物件,就會在物件數量達到堆最大容量時產生OutOfMemor

不得不知道的Java記憶體溢位之在經常呼叫的方法內不要new大物件

        相信只要你看過Java的書,你一定會看到類似這樣的話:千萬不要假想內在處理器已經幫你把記憶體處理好了去做事。         看過,真的就只是看過。和C還有C++相比,Java在大部分