程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 淺析Java中的內存洩露

淺析Java中的內存洩露

編輯:關於JAVA

淺析Java中的內存洩露。本站提示廣大學習愛好者:(淺析Java中的內存洩露)文章只能為提供參考,不一定能成為您想要的結果。以下是淺析Java中的內存洩露正文


ava最顯著的一個優勢就是它的內存治理機制。你只需簡略創立對象,java的渣滓收受接管機制擔任分派和釋放內存。但是情形其實不像想像的那末簡略,由於在Java運用中常常產生內存洩露。

本教程演示了甚麼是內存洩露,為何會產生內存洩露和若何預防內存洩露。

甚麼是內存洩露?

界說:假如對象在運用中不再被應用,但因為它們在其他處所被援用,渣滓收受接管卻不克不及移除它們(如許就形成了許多內存不克不及釋放,從而招致內存溢出的景象。譯注)。


要懂得這必定義,我們須要懂得內存中對象的狀況。下圖解釋了那些是未應用,那些是未援用。

 從圖中可以看到被援用對象和未援用對象(的規模)。未援用對象可以被渣滓收受接管機制收受接管,而被援用對象不克不及被渣滓收受接管機制收受接管。未援用對象固然是沒有應用的,由於沒有其他對象援用了它。但是未應用對象其實不都是未援用的。某些未應用的對象依然被其他處所援用!這就是內存洩露原由。


為何會產生內存洩露?

讓我們來上面的這個例子,看看為何會產生內存洩露。在以下例子中,A對象援用了B對象。A的性命周期(t1-t4)比B的性命周期(t2-t3)要長的多,當B不再在運用中被應用,A依然持有對B的援用。如許一來,渣滓收受接管機制不克不及從內存中移除B。這很有能夠招致內存溢出成績,由於假如其他許多對象像A一樣,那末內存中將會有許多不克不及被收受接管的對象,這將消費年夜量內存空間。
也有能夠的情形是B持有了年夜量對其他對象的援用。這些被B援用的對象異樣不會被收受接管失落。一切這些未應用的對象將會消費名貴的內存空間。

 若何預防內存洩露?

以下是一些預防內存洩露的疾速技能:

1、留心聚集類,好比HashMap,ArrayList等等,由於他們是內存洩露常常產生的處所。當它們被聲明為靜態對象時,他們的性命周期就和運用的性命周期一樣長。

2、留心事宜監聽器和回調。假如一個類注冊了監聽器,但當該類不再被應用後沒有刊出監聽器,能夠會產生內存洩露。

3、“假如一個類治理本身的內存,法式員應當小心內存洩露。”[1],許多時刻對象中的指向其他對象成員變量須要設置成null(能力被收受接管)。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved