當前位置:首頁 > IT技術

內存溢出

時間:2019-10-07 07:12:14來源:IT技術作者:seo實驗室小編閱讀:72次「手機版」
 

內存溢出

#什么是內存溢出

內存溢出是指應用系統中存在無法回收的內存或者使用的內存過多,最終使得程序運行所需要的內存大于JVM所提供的最大內存。

#java如何管理內存

java的內存管理就是對象的分配和釋放問題。在java中,內存的分配是由程序來完成的,而內存的釋放是由垃圾收集器(Garbage Collection,GC)完成的,開發者不需要通過調用GC來釋放內存,因為不同的JVM實現者可能使用不同的算法管理GC,有的是內存使用達到一定程度時,GC才開始工作,也有定時執行的,有的是中斷式執行GC。

#GC回收機制

GC只能回收無用并且不再被其他對象引用的那些對象所占用的空間。java的內存垃圾回收機制是從程序的主要運行對象開始檢查引用鏈,當遍歷一遍后發現沒有被引用的孤立對象就作為垃圾回收。

#內存溢出的原因

常見的有以下幾種:

①內存中加載的數據量過于龐大,如一次從數據庫取出過多數據

②集合類中有對對象的引用,使用完后未清空,使得JVM不能回收

代碼中存在死循環或循環中產生大量重復的對象實體

④使用的第三方軟件中存在BUG

⑤啟動參數內存設定值過小

#內存溢出的解決方式

①修改JVM啟動參數,直接增加內存。<物理方式>

容器為tomcat:修改catalina.BAT

set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%

下面加

JAVA_OPTS='-Xms512m -Xmx1024m'
JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=64M -XX:MaxPermSize=256m"

其中 JAVA_OPTS='-Xms512m -Xmx1024m' 是設置Tomcat使用的內存的大小.

-XX:PermSize=64M -XX:MaxPermSize=256m 指定類空間(用于加載類)的內存大小

②檢查錯誤日志,查看“OutOfMemMemory”錯誤前是否有其他的異常或者錯誤。

--java.lang.outofmemoryERROR: ......java heap space....<堆棧溢出>
--java.lang.OutOfMemoryError: GC overhead limit exceeded 
JDK6新增錯誤類型,當GC為釋放很小空間占用大量時間時拋出;一般是因為堆太小,導致異常的原因,沒有足夠的內存。 
  【解決方案】: 
  1、查看系統是否有使用大內存的代碼或死循環; 
  2、通過添加JVM配置,來限制使用內存: 
  < jvm-arg>-XX:-UseGCOverheadLimit< /jvm-arg> 
--java.lang.OutOfMemoryError: PermGen space:這種是P區內存不夠,可通過調整JVM的配置: 
  < jvm-arg>-XX:MaxPermSize=128m< /jvm-arg> 
  < jvm-arg>-XXermSize=128m< /jvm-arg> 
  【注】: 
  JVM的Perm區主要用于存放Class和Meta信息的,Class在被Loader時就會被放到PermGen space,這個區域成為年老代,GC在主程序運行期間不會對年老區進行清理,默認是64M大小,當程序需要加載的對象比較多時,超過64M就會報這部分內存溢出了,需要加大內存分配,一般128m足夠。 

③對代碼進行走查和分析,找出可能發生內存溢出的位置。重點排查一下幾點:

–檢查代碼中是否有死循環或遞歸調用

–檢查是否有大循環重復產生新對象實體

–檢查對數據庫查詢中,是否有一次獲得全部數據的查詢。一般來說,如果一次取十萬條記錄到內存,就可能引起內存溢出。

–檢查List、Map等集合對象是否有使用完后,未清除的問題。List、Map等集合對象會始終存有對對象的引用,使得這些對象不能被GC回收。

④使用內存查看工具動態查看內存使用情況:Optimizeit profiler、JProbe Profiler、JinSight和Java1.5的jconsole等。

一般來說,一個正常的系統在其啟動完成后其內存的占用量是基本穩定的,而不應該是無限制的增長的。持續地觀察系統運行時使用的內存的大小,可以看到在內存使用監控窗口中是基本規則的鋸齒形的圖線,如果內存的大小持續地增長,則說明系統存在內存泄漏問題。

相關閱讀

筆記本電腦如何選購并安裝內存條

1、首先你要查看你的原先內存條的型號、代數。現在在內存分為|DDR、DDR2、DDR3的代數。如今一般的內存都是三代,即DDR3,而DDR3與DDR

Windriver PCI大內存分配說明

在使用windriver進行驅動開發時,不可避免地會使用到內存分配的功能,這里先介紹下jungo公司的技術手冊 https://www.jungo.com/st/su

棧溢出例子理解

背景:最近在看一些教學視頻,然后主講人敲了一段棧溢出的代碼。我當場蒙蔽了-。- ! 而且他也沒有細講原理,最為一名愛探險星人,我決定

文本溢出隱藏

1、單行文本溢出隱藏{overflow : hidden;text-overflow : ellipsis;white-space : nowrap;}2、多行文本溢出{overflow : hidden;t

Java中關于內存泄漏出現的原因匯總及如何避免內存泄漏

來先看看下面的例子,為什么會發生內存泄漏。下面這個例子中,A對象引用B對象,A對象的生命周期(t1-t4)比B對象的生命周期(t2-t3)長的多。當

分享到:

欄目導航

推薦閱讀

熱門閱讀

云南彩票投注站申请