1. 程式人生 > >內存泄漏和內存溢出

內存泄漏和內存溢出

溢出 程序 生成 參數 如果 增加 創建 比較 文件

概念

內存泄漏(memory leak):無法釋放已經不再使用的內存空間。
內存溢出(out of memory): 程序申請的內存超過了現有的內存空間。

內存泄漏

發生場景:

靜態變量/靜態引用/靜態集合類:靜態對象存放在方法區,隨線程的結束而結束,會始終存在,如果對象比較復雜就會發生內存泄漏
各種連接未顯示關閉:數據庫連接、網絡連接、IO連接,沒顯示的close,會造成很多對象無法回收
沒有及時的將對象設置為空:例如集合的pop方法
監聽器

避免內存泄漏:

盡早釋放無用的引用
避免在循環語句中創建對象
盡量少用靜態的變量

內存溢出

發生場景:

集合類中的對象的引用在使用完之後未清空,導致JVM不能回收。
內存中加載數據過大,如一次從數據庫中讀取大量的數據。
代碼中的死循環或在循環體中產生多個重復對象實體。
啟動JVM參數設置過小。
方法區主要存放的是類信息、常量、靜態變量等。所以如果程序加載的類過多,或者使用反射、gclib等這種動態代理生成類的技術,就可能導致該區發生內存溢出

避免內存溢出(除了避免內存泄漏的幾點之外還包括以下幾點):

修改JVM啟動參數,直接增加內存。
開啟大型文件或從數據庫一次拿了太多的數據很容易造成內存溢出,所以在這些地方要大概計算一下數據量的最大值是多少,並且設定所需最小及最大的內存空間值。

https://blog.csdn.net/u012813201/article/details/73793668
https://www.cnblogs.com/panxuejun/p/5883044.html

內存泄漏和內存溢出