1. 程式人生 > >java異常處理:OOM(記憶體溢位異常)

java異常處理:OOM(記憶體溢位異常)

什麼是OOM OOM,全稱“Out Of Memory”,翻譯成中文就是“記憶體用完了”,來源於java.lang.OutOfMemoryError。看下關於的官方說明: Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector. 意思就是說,當JVM因為沒有足夠的記憶體來為物件分配空間並且垃圾回收器也已經沒有空間可回收時,就會丟擲這個error(注:非exception,因為這個問題已經嚴重到不足以被應用處理)

為什麼會OOM?

為什麼會沒有記憶體了呢?原因不外乎有兩點:

1)分配的少了:比如虛擬機器本身可使用的記憶體(一般通過啟動時的VM引數指定)太少。

2)應用用的太多,並且用完沒釋放,浪費了。此時就會造成記憶體洩露或者記憶體溢位。

記憶體洩露:申請使用完的記憶體沒有釋放,導致虛擬機器不能再次使用該記憶體,此時這段記憶體就洩露了,因為申請者不用了,而又不能被虛擬機器分配給別人用。

記憶體溢位:申請的記憶體超出了JVM能提供的記憶體大小,此時稱之為溢位。

    在之前沒有垃圾自動回收的日子裡,比如C語言和C++語言,我們必須親自負責記憶體的申請與釋放操作,如果申請了記憶體,用完後又忘記了釋放,比如C++中的new了但是沒有delete,那麼就可能造成記憶體洩露。偶爾的記憶體洩露可能不會造成問題,而大量的記憶體洩露可能會導致記憶體溢位。

     而在Java語言中,由於存在了垃圾自動回收機制,所以,我們一般不用去主動釋放不用的物件所佔的記憶體,也就是理論上來說,是不會存在“記憶體洩露”的。但是,如果編碼不當,比如,將某個物件的引用放到了全域性的Map中,雖然方法結束了,但是由於垃圾回收器會根據物件的引用情況來回收記憶體,導致該物件不能被及時的回收。如果該種情況出現次數多了,就會導致記憶體溢位,比如系統中經常使用的快取機制。Java中的記憶體洩露,不同於C++中的忘了delete,往往是邏輯上的原因洩露。

相關推薦

java異常處理OOM記憶體溢位異常

什麼是OOM? OOM,全稱“Out Of Memory”,翻譯成中文就是“記憶體用完了”,來源於java.lang.OutOfMemoryError。看下關於的官方說明: Thrown when the Java Virtual Machine cannot allocat

Java學習9super隱式引數關鍵字記憶體分析詳解及用法

super關鍵字,是一個隱式引數(另一個隱式引數是this)。 注:super關鍵字和this關鍵字極為類似,學習時可參考this關鍵字用法。this(隱式引數)關鍵字記憶體分析詳解及用法 1.概述 super是直接父類的引用(this是當前物件的引用

JAVA web呼叫執行python指令碼程式的四種方式,迴避java.lang.OutOfMemoryErrorPermGen space記憶體溢位問題

我在網上搜到的JAVA呼叫python程式的三種方式: 方式一:呼叫python函式。可以傳入引數,獲取返回值。  public static void PythonFunctionTest(){         

老王Python-進階篇4-異常處理1.3周末習題

調用 page eve sage urn put not name bject 一 編寫with操作類Fileinfo(),定義__enter__和__exit__方法。完成功能: 1.1 在__enter__方法裏打開Fileinfo(filename),並且返回file

【linux】Valgrind工具集詳解Memcheck記憶體錯誤檢測器

一、概述 Memcheck是一個記憶體錯誤檢測器。它可以檢測C和C ++程式中常見的以下問題: 1、非法記憶體:如越界、釋放後繼續訪問; 2、使用未初始化的值; 3、釋放記憶體錯誤:如double-free(同一記憶體上執行了兩次free)、或者 malloc、new、new[] 與

Java集合框架SetHashSet,LinkedHashSet,TreeSet

Set概述  Set幾乎都是內部用一個Map來實現, 因為Map裡的KeySet就是一個Set,而value是假值,全部使用同一個Object。Set的特徵也繼承了那些內部Map實現的特徵。 HashSet 1. 定義 package java.util; p

深入理解java虛擬機器系列java記憶體區域與記憶體溢位異常

文章主要是閱讀《深入理解java虛擬機器:JVM高階特性與最佳實踐》第二章:Java記憶體區域與記憶體溢位異常 的一些筆記以及概括。 好了開始。如果有什麼錯誤或者遺漏,歡迎指出。 一、概述 先上一張圖 這張圖主要列出了Java虛擬機器管理的記憶體的幾個區域。 常有人

深入Java虛擬機器筆記Java記憶體區域與記憶體溢位異常

1、程式計數器為很小的記憶體空間,為當前執行緒執行的位元組碼的行號指示器,通過改變計數器的值來選取下一條需要執行的位元組碼指令,迴圈、分支等基礎功能都是需要計數器來完成的 2、Java虛擬機器棧為Java方法執行的記憶體模型,每個方法被執行時都會同時建立棧

JAVA虛擬機器JVM劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 虛擬機器物件

本部落格參考《深入理解Java虛擬機器》(第二版)一書,提取重點知識,再加以個人的理解編寫而成。轉載請標明來源。 JAVA虛擬機器(JVM)劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 虛擬機器物件 Java物件的建立 1、類載入過程

JAVA虛擬機器JVM劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 執行時資料區域

本部落格參考《深入理解Java虛擬機器》(第二版)一書,提取重點知識,再加以個人的理解編寫而成。轉載請標明來源。 JVM劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 執行時資料區域 概述 執行時資料區域 程式計數器 Java虛擬機

【夾娃系列】java面試基礎知識儲備¥2——JVM記憶體劃分和記憶體溢位異常的原因和解決方法

JVM記憶體劃分和記憶體溢位 JVM記憶體劃分 記憶體溢位的異常和解決辦法 JVM記憶體劃分 堆:存放物件例項,被所有的執行緒共享的一塊區域。垃圾收集器管理的主要區域。 方法區:儲存虛擬機器載入的類資訊,常量,靜態變

《深入理解java虛擬機器》讀書筆記---- Java記憶體區域與記憶體溢位異常

執行時資料區域 java虛擬機器所管理的記憶體將會包括以下幾個執行時資料區域: 1、程式計數器 程式計數器是一塊較小的記憶體空間,它可以看作是當前執行緒所執行位元組碼的行號指示器。在虛擬機器的概念模型裡,位元組碼直譯器的工作就是通過改變這個計數器的值來選取下一條需要執

虛擬機器學習之一java記憶體區域與記憶體溢位異常

1.執行時資料區域 java虛擬機器在執行java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。這些區域都有各自的用途和建立、銷燬時間,有的區域伴隨虛擬機器程序的啟動而存在,有些區域則依賴使用者執行緒的啟動和結束而建立和銷燬。 1.1程式計數器 程式計數器

Java 記憶體區域與記憶體溢位異常

一、虛擬機器中Java物件的建立 語言層面上,建立Java物件通常僅僅是一個new關鍵字而已。 在虛擬遇到new指令時: 1、首先檢查這個指令的引數是否能在常量池中定位到一個類的符號引用,並檢查這個類的符號引用代表的類是否已經載入,解析和初始化過。如果沒有,則必須執行類

Java 記憶體區域與記憶體溢位異常

實戰:OutOfMemoryError 異常 參考:《深入理解Java虛擬機器》-jvm高階特性與最佳實現(周志明著) 之前的兩篇中介紹Java虛擬機器中各個執行時記憶體區域的作用,這節中通過人為異常的方式驗證各個執行時區儲存的內容 一、Java堆溢位 Java堆中用

JAVA記憶體區域與記憶體溢位異常

目錄 0、前沿 1、概述 2、執行時資料區域 2.1、程式計數器 2.2、JAVA虛擬機器棧 2.3、本地方法棧 2.4、JAVA堆 2.5、方法區 2.5.1、執行時常量池 3、HotSpot虛擬機器 3.1、物件的建立 3.2、物件的記憶體佈局

JAVA執行時資料區域記憶體區域與記憶體溢位異常

方法區(Method Area) 儲存內容用於儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料。與執行緒的關係 各個執行緒共享該記憶體區域異常 這區域的記憶體回收目標

深入理解JVM—第二章Java記憶體區域與記憶體溢位異常

1,概述 Java較C、C++,Java可以利用虛擬機器的自動記憶體管理機制,避免繁瑣的記憶體分配與回收。不容易出現記憶體洩漏和記憶體溢位問題。 記憶體洩漏:指程式申請到的記憶體空間不再歸還(無法歸還),可使用完該記憶體空間的程式也不能再訪問該空間(

[jvm解析系列][一]Java記憶體區域分配和記憶體溢位異常OOM

學過作業系統的同學應該比較清楚,一個作業系統必須要有完善的記憶體管理系統(頁/段式的管理),相應的jvm全稱java虛擬機器應該也有類似的一種管理記憶體的方式,這種方式是建立在真實的作業系統記憶體管理方式之上的,他把記憶體分配成了不同的區域,形成了java記憶體模型。 那麼

Jboss—java.lang.OutOfMemoryErrorMetaspace 解決記憶體溢位,擴大記憶體

講一講故事開頭吧,小菜自己覺得非常重要! 今天Jenkins構建專案後端成功,可怕的是到了伺服器上部署時就失敗了。開始拍錯,先是懷疑Jenkins在搗亂呢,因此在本地打包釋出,非常順利的成功了。把這個war包拿到伺服器上去部署,竟然失敗!排除Jenkins的嫌