91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解Java代碼的內存管理

發布時間:2021-11-25 14:23:34 來源:億速云 閱讀:138 作者:柒染 欄目:編程語言

這期內容當中小編將會給大家帶來有關如何理解Java代碼的內存管理,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

小編通過幾個方面來介紹Java代碼的內存管理。

有的代碼,GC根本就回收不了,直接系統掛掉。GC是一段程序,不是智能,他只回收他認為的垃圾,而不是回收你認為的垃圾。

GC垃圾回收:

Grabage Collection相信學過JAVA的人都知道這個是什么意思.但是他是如何工作的呢?

首先,JVM在管理內存的時候對于變量的管理總是分新對象和老對象。新對象也就是開發者new出來的對象,但是由于生命周期短,那么他占用的內存并不是馬上釋放,而是被標記為老對象,這個時候該對象還是要存在一段時間。然后由JVM決定他是否是垃圾對象,并進行回收。

所以我們可以知道,垃圾內存并不是用完了馬上就被釋放,所以就會產生內存釋放不及時的現象,從而降低了內存的使用。而當程序浩大的時候。這種現象更為明顯,并且GC的工作也是需要消耗資源的。所以,也就會產生內存浪費。

JVM中的對象生命周期里談內存回收:

對象的生命周期一般分為7個階段:創建階段,應用階段,不可視階段,不可到達階段,可收集階段,終結階段,釋放階段。

創建階段:首先大家看一下,如下兩段代碼:

test1:

for( int i=0; i<10000; i++)  Object obj=new Object();

test2:

Object obj=null;  for( int i=0; i<10000; i++)  obj=new Object();

這兩段代碼都是相同的功能,但是顯然test2的性能要比test1性能要好,內存使用率要高,這是為什么呢?原因很簡單,test1每次執行for循環都要創建一個Object的臨時對象,但是這些臨時對象由于JVM的GC不能馬上銷毀,所以他們還要存在很長時間,而test2則只是在內存中保存一份對象的引用,而不必創建大量新臨時變量,從而降低了內存的使用。

另外不要對同一個對象初始化多次。例如:

public class A{  private Hashtable table = new Hashtable();  public A(){ table = new Hashtable();  // 這里應該去掉,因為table已經被初始化.  }  }

這樣就new了兩個Hashtable,但是卻只使用了一個。另外一個則沒有被引用.而被忽略掉.浪費了內存.并且由于進行了兩次new操作.也影響了代碼的執行速度。

應用階段:即該對象至少有一個引用在維護他.

不可視階段:即超出該變量的作用域。這里有一個很好的做法,因為JVM在GC的時候并不是馬上進行回收,而是要判斷對象是否被其他引用在維護.所以,這個時候如果我們在使用完一個對象以后對其obj=null或者obj.doSomething()操作,將其標記為空,可以幫助JVM及時發現這個垃圾對象.

不可到達階段:就是在JVM中找不到對該對象的直接或者間接的引用。

可收集階段,終結階段,釋放階段:此為回收器發現該對象不可到達,finalize方法已經被執行,或者對象空間已被重用的時候。

JAVA的析構方法:

可能不會有人相信,JAVA有析構函數? 是的,有。因為JAVA所有類都繼承至Object類,而finalize就是Object類的一個方法,這個方法在JAVA中就是類似于C++析構函數.一般來說可以通過重載finalize方法的形式才釋放類中對象.如:

public class A{  public Object a;  public A(){ a = new Object ;}  protected void finalize() throws java.lang.Throwable{  a = null; // 標記為空,釋放對象  super.finalize(); // 遞歸調用超類中的finalize方法.  }  }

當然,什么時候該方法被調用是由JVM來決定的\

一般來說,我們需要創建一個destory的方法來顯式的調用該方法.然后在finalize也對該方法進行調用,實現雙保險的做法.

由于對象的創建是遞歸式的,也就是先調用超級類的構造,然后依次向下遞歸調用構造函數,所以應該避免在類的構造函數中初始化變量,這樣可以避免不必要的創建對象造成不必要的內存消耗.當然這里也就看出來接口的優勢.

數組的創建:

由于數組需要給定一個長度,所以在不確定數據數量的時候經常會創建過大,或過小的數組的現象.造成不必要的內存浪費,所以可以通過軟引用的方式來告訴JVM及時回收該內存.(軟引用,具體查資料).

例如:

Object obj = new char[10000000000000000];  SoftReference ref = new SoftReference(obj);

共享靜態存儲空間:

我們都知道靜態變量在程序運行期間其內存是共享的,因此有時候為了節約內存工件,將一些變量聲明為靜態變量確實可以起到節約內存空間的作用.但是由于靜態變量生命周期很長,不易被系統回收,所以使用靜態變量要合理,不能盲目的使用.以免適得其反。

因此建議在下面情況下使用:

1,變量所包含的對象體積較大,占用內存過多.

2,變量所包含對象生命周期較長.

3,變量所包含數據穩定.

4,該類的對象實例有對該變量所包含的對象的共享需求.(也就是說是否需要作為全局變量).

對象重用與GC:

有的時候,如數據庫操作對象,一般情況下我們都需要在各個不同模塊間使用,所以這樣的對象需要進行重用以提高性能.也有效的避免了反復創建對象引起的性能下降.

一般來說對象池是一個不錯的注意.如下:

public abstarct class ObjectPool{  private Hashtable locked,unlocked;  private long expirationTime;  abstract Object create();  abstract void expire( Object o);  abstract void validate( Object o);  synchronized Object getObject(){...};  synchronized void freeObject(Object o){...};  }

這樣我們就完成了一個對象池,我們可以將通過對應的方法來存取刪除所需對象.來維護這快內存提高內存重用.

當然也可以通過調用System.gc()強制系統進行垃圾回收操作.當然這樣的代價是需要消耗一些cpu資源.

不要提前創建對象:

盡量在需要的時候創建對象,重復的分配,構造對象可能會因為垃圾回收做額外的工作降低性能.

JVM內存參數調優:

強制內存回收對于系統自動的內存回收機制會產生負面影響,會加大系統自動回收的處理時間,所以應該盡量避免顯式使用System.gc(),

JVM的設置可以提高系統的性能.例如:

java -XX:NewSize=128m -XX:MaxNewSize=128m -XX:SurvivorRatio=8 -Xms512m -Xmx512m

具體可以查看java幫助文檔.我們主要介紹程序設計方面的性能提高.

JAVA程序設計中有關內存管理的其他經驗:

根據JVM內存管理的工作原理,可以通過一些技巧和方式讓JVM做GC處理時更加有效.,從而提高內存使用和縮短GC的執行時間.

1,盡早釋放無用對象的引用.即在不使用對象的引用后設置為空,可以加速GC的工作.(當然如果是返回值.....)

2,盡量少用finalize函數,此函數是JAVA給程序員提供的一個釋放對象或資源的機會,但是卻會加大GC工作量.

3,如果需要使用到圖片,可以使用soft應用類型,它可以盡可能將圖片讀入內存而不引起OutOfMemory.

4,注意集合數據類型的數據結構,往往數據結構越復雜,GC工作量更大,處理更復雜.

5,盡量避免在默認構造器(構造函數)中創建,初始化大量的對象.

6,盡量避免強制系統做垃圾回收.會增加系統做垃圾回收的最終時間降低性能.

7,盡量避免顯式申請數組,如果不得不申請數組的話,要盡量準確估算數組大小.

8,如果在做遠程方法調用.要盡量減少傳遞的對象大小.或者使用瞬間值避免不必要數據的傳遞.

9,盡量在合適的情況下使用對象池來提高系統性能減少內存開銷,當然,對象池不能過于龐大,會適得其反.

上述就是小編為大家分享的如何理解Java代碼的內存管理了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石门县| 古田县| 安康市| 桦甸市| 那曲县| 康定县| 珲春市| 虞城县| 融水| 隆回县| 辛集市| 武宣县| 威宁| 正蓝旗| 东台市| 扶沟县| 蒙山县| 永胜县| 大渡口区| 马龙县| 柘城县| 冕宁县| 阳山县| 凭祥市| 上杭县| 怀来县| 同仁县| 长垣县| 佳木斯市| 绍兴市| 甘泉县| 汉川市| 建德市| 江达县| 闽侯县| 永昌县| 阳山县| 石景山区| 沙坪坝区| 大兴区| 突泉县|