1. 程式人生 > >Java常見記憶體溢位(OOM)解決方案

Java常見記憶體溢位(OOM)解決方案

1,         程式計數器

一塊很小的記憶體空間,作用是當前執行緒所執行的位元組碼的行號指示器。

2,         java棧

與程式計數器一樣,java棧(虛擬機器棧)也是執行緒私有的,其生命週期與執行緒相同。通常存放基本資料型別,物件引用(一個指向物件起始地址的引用指標或一個代表物件的控制代碼),reeturnAddress型別(指向一條位元組碼指令的地址)

棧區域有兩種異常型別:如果執行緒請求的棧深度大於虛擬機器所允許的深度,將拋StrackOverflowError異常;如果虛擬機器棧可以動態擴充套件(大部分虛擬機器都可動態擴充套件),當擴充套件時無法申請到足夠的記憶體時會丟擲OutOfMemoryError異常。

3,         本地方法棧

與虛擬機器棧作用很相似,區別是虛擬機器棧為虛擬機器執行java方法服務,而本地方法棧則是為虛擬機器用到的Native方法服務。和虛擬機器棧一樣可能丟擲StackOverflowError和OutOfMemoryError異常。

4,         java堆

java Heap是jvm所管理的記憶體中最大的區域。JavaHeap是被所有執行緒共享的一塊記憶體區域,在虛擬機器啟動時建立。主要存放物件例項。JavaHeap是垃圾收集器管理的主要區域,其可細分為新生代和老年代。如果在堆中沒有記憶體完成例項分配,並且也無法再擴充套件時,會丟擲OutOfMemoryError異常。

5,         方法區

與javaHeap一樣是各個執行緒共享的記憶體區域,用於存放已被虛擬機器載入的類資訊、常量、靜態變數、及時編譯器編譯後的程式碼等資料。當方法區無法滿足記憶體分配的需求時,將丟擲OutOfMemoryError異常。方法同時包含常聽說的執行時常量池,用於存放編譯期生成的各種字面量和符號引用。

6,         直接記憶體

直接記憶體並不是虛擬機器執行時資料區的一部分,也不是java虛擬機器規範中定義的記憶體區域,是jvm外部的記憶體區域,這部分割槽域也可能導致OutOfMemoryError異常。

二,jvm引數

-Xss(StackSpace)棧空間

-Xms ,-Xmx(heap memory space)堆空間:Heap是大家最為熟悉的區域,他是jvm用來儲存物件例項的區域,Heap在32位的系統中最大為2G,其大小通過-Xms和-Xmx來控制,-Xms為jvm啟動時申請的最小Heap記憶體,預設為實體記憶體的1/64,但小於1G,-Xmx為jvm可申請的最大的Heap記憶體,預設為實體記憶體的1/4,一般也小於1G,預設當空餘堆記憶體小於40%時,jvm會最大Heap的大小到-Xmx指定大小,可通過-XX:MinHeapFreeRatio來指定這個比例,當空餘堆記憶體大於70%時,JVM會將Heap的大小往-Xms指定的大小調整,可通過-XX:MaxHeapFreeRatio來指定這個比例,但通常為了避免頻繁調整HeapSize的大小,將-Xms和-Xmx的值設為相同。

-XX:PermSize  -XX:MaxPermSize:方法區持久代大小:方法區域也是全域性共享的,在一定的條件下它也會被 GC,當方法區域需要使用的記憶體超過其允許的大小時,會丟擲 OutOfMemory的錯誤資訊。

三,常見記憶體溢位錯誤解決辦法

1,   OutOfMemoryError異常

除了程式計數器外,虛擬機器記憶體的其他幾個執行時區域都有發生OutOfMemoryError(OOM)異常的可能,

Java Heap 溢位

一般的異常資訊:java.lang.OutOfMemoryError:Java heap spacess

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

出現這種異常,一般手段是先通過記憶體映像分析工具(如Eclipse Memory Analyzer)對dump出來的堆轉存快照進行分析,重點是確認記憶體中的物件是否是必要的,先分清是因為記憶體洩漏(Memory Leak)還是記憶體溢位(Memory Overflow)。

如果是記憶體洩漏,可進一步通過工具檢視洩漏物件到GC Roots的引用鏈。於是就能找到洩漏物件時通過怎樣的路徑與GC Roots相關聯並導致垃圾收集器無法自動回收。

如果不存在洩漏,那就應該檢查虛擬機器的引數(-Xmx與-Xms)的設定是否適當。

2,   虛擬機器棧和本地方法棧溢位

如果執行緒請求的棧深度大於虛擬機器所允許的最大深度,將丟擲StackOverflowError異常。

如果虛擬機器在擴充套件棧時無法申請到足夠的記憶體空間,則丟擲OutOfMemoryError異常

這裡需要注意當棧的大小越大可分配的執行緒數就越少。

3,   執行時常量池溢位

異常資訊:java.lang.OutOfMemoryError:PermGen space

如果要向執行時常量池中新增內容,最簡單的做法就是使用String.intern()這個Native方法。該方法的作用是:如果池中已經包含一個等於此String的字串,則返回代表池中這個字串的String物件;否則,將此String物件包含的字串新增到常量池中,並且返回此String物件的引用。由於常量池分配在方法區內,我們可以通過-XX:PermSize和-XX:MaxPermSize限制方法區的大小,從而間接限制其中常量池的容量。

4,   方法區溢位

方法區用於存放Class的相關資訊,如類名、訪問修飾符、常量池、欄位描述、方法描述等。

異常資訊:java.lang.OutOfMemoryError:PermGen space

方法區溢位也是一種常見的記憶體溢位異常,一個類如果要被垃圾收集器回收,判定條件是很苛刻的。在經常動態生成大量Class的應用中,要特別注意這點。

相關推薦

Java常見記憶體溢位(OOM)解決方案

1,         程式計數器 一塊很小的記憶體空間,作用是當前執行緒所執行的位元組碼的行號指示器。 2,         java棧 與程式計數器一樣,java棧(虛擬機器棧)也是執行緒私有的,其生命週期與執行緒相同。通常存放基本資料型別,物件引用(一個指向物件起始地址

徹底解決Java處理圖片時,BufferedImage記憶體溢位解決方案

最近系統總數無原因出現記憶體溢位問題,我程式內會讀取一張圖片,先壓縮圖片大小,然後轉成byte陣列寫入到資料庫 但是經過大量測試調查,在壓縮圖片時使用了Java的java.awt.image.BufferedImage總會佔用記憶體不釋放,造成記憶體疊加,最終記憶體溢位。

android 本地大圖片造成記憶體溢位解決方案

在使用中,小的圖片,可以通過drawable直接引用setImageResource或者setBackgroundResource, 但涉及到大圖時,儘量通過decodeStream來建立bitmap,然後再給對應的view使用。 public static Bitmap readBitMap(

MySQL資料庫查詢結果過大解決記憶體溢位解決方案

正常來說,一般是不會出現這種情況的,但也不能保證,偶爾有這種情況發生,解決方案如下: 1.使用分頁查詢語句。    因為分頁查詢每次只會查詢少量資料,所以不會佔用太多記憶體,而且資料量很大的時候,分頁

java常見記憶體溢位情形

虛擬機器棧溢位(如果虛擬機器在擴充套件時無法申請到足夠的記憶體空間將丟擲OutOfMemoryError)package com.jvm.memory; import java.util.ArrayList; import java.util.List; public

Java服務記憶體溢位問題解決和總結

最近,公司測試環境服務發現一個問題:一個介面服務,合作方再調介面時,經常會出現連線超時異常(connection reset by peer),緊接著看到服務記憶體100%,加記憶體也沒用,不管加多少還是會緩慢升至100%。如下圖: 通過各位大神的指點迷津,大概定位到以

MyEclipse執行專案的記憶體溢位問題解決方案

 在myEclipse中,開啟Windows -> Preferences -> Java -> Installed JREs -> 點選正在使用的JDK -> Edit -> Default VM Arguments文字框中輸入:

matlab記憶體溢位解決方案

(1) 增加虛擬記憶體:cmd -> taskmgr 開啟工作管理員,檢視實體記憶體和虛擬記憶體,可觀察matlab在執行過程中是否超過實體記憶體和虛擬記憶體。若超過,增加虛擬記憶體的方法是不可行的。實體記憶體不足的時候可以通過將電腦的虛擬記憶體設定得大一

Java常見記憶體溢位異常分析

http://www.importnew.com/14604.html http://blog.csdn.net/znb769525443/article/details/50853712 簡介 Java虛擬機器規範規定JVM的記憶體分為了好幾塊,比如堆,棧,程式計數

matlab記憶體溢位解決方案【學習筆記】

2.檢視當前Java虛擬機器最大堆記憶體, 敲入:java.lang.Runtime.getRuntime.maxMemory 3.檢視Java虛擬機器版本.敲入:version -java 4.在 $MATLAB\bin\$ARCH 路徑下新建java.opts檔案. $MATLAB是根路徑,例如C:\M

java專案記憶體溢位問題解決方法

 }      3 寫程式碼的時候處理記憶體溢位             try{                //do   sth      ....             }catch   (outofmemoryerror   e){//可以用一個共通函式來執行.              syst

bitmap引起的記憶體溢位OutOfMemory解決方案

一、問題描述: Android下的相機在獨自使用時,拍照沒有問題,通過我們的程式碼呼叫時,也正常,但是更換了不同廠商的平板,ROM由Android4.0變成了Android4.1後,拍照出現了OutOfMemory異常,程式中斷退出。如何解決這個問題呢

記憶體溢位問題解決方案與Visualvm監聽新增

故障現象: 由記憶體溢位(OutOfMemoryError: PermGen space) 故障原因: 1.     本身比較龐大,系統初始載入的類超過9000個,JDK1.8(不含)之前的JDK通過分配永久儲存區域(Permanent Generation space)

node打包專案出現的記憶體溢位解決方案

1,專案需求 最近所做的一個專案,在不進行程式碼分割的情況下,專案的js打包檔案已經超過2M的大小。所以急需程式碼分割的功能,實現頁面的快速相應。 2,遇到的問題 專案的js程式碼,已經超過10w行,打包的時候出現了這樣的一個問題: FATAL ERROR: C

點陣圖引起的記憶體溢位OutOfMemory解決方案

點陣圖引起的記憶體溢位OutOfMemory解決方案作者:老帥一、問題描述:Android下的相機在獨自使用時,拍照沒有問題,通過我們的程式碼呼叫時,也正常,但是更換了不同廠商的平板,ROM由Andro

Excel大檔案時讀取記憶體溢位解決方案,測試50M的Excel通過。

1.大檔案xlsx的檔案解析,本案例僅僅只是讀取Excel檔案的內容為例。具體需求可按自己的需求改。 package com.sundy.parse.util; import java.io.File; import java.io.IOException; import

C++常見記憶體錯誤及解決方案

轉自 本文作者:Tocy e-mail: [email protected] C++中記憶體錯誤通常屬於執行時錯誤,只有在程式執行時才能發現,編譯器無法自動檢測到記憶體錯誤。多數情況下是程式邏輯或者引數存在某些錯誤。下面總結一下C++常見的記憶體錯誤: 1. 記憶體洩露 記

常見Java記憶體溢位解決方法詳解

Java programming language具有目前大部分程式語言所共有的一些特徵,被特意設計用於網際網路的分散式環境。Java具有類似於C++語言的"形式和感覺",但它要比C++語言更易於使用,而且在程式設計時徹底採用了一種"以物件為導向"的方式。使用Java編寫的

java常見的異常以及解決方案-持續更新

同學們有沒有被java中的異常機制弄得頭大?不要急,接下來,就帶你熟悉熟悉java中常見的異常以及解決方法(其實就是程式碼的嚴謹性的問題) 1.java.lang.NullPointerExcepti

java 中三種常見記憶體溢位錯誤的處理方法

相信有一定Java開發經驗的人或多或少都會遇到OutOfMemoryError的問題,這個問題曾困擾了我很長時間,隨著解決各類問題經驗的積累以及對問題根源的探索,終於有了一個比較深入的認識。 在解決java記憶體溢位問題之前,需要對jvm(java虛擬機器)的