最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java內存溢出和內存泄露

 更新時間:2017年10月24日 15:04:36   作者:動力節(jié)點  
這篇文章主要介紹了Java內存溢出和內存泄露的相關資料,需要的朋友可以參考下

雖然jvm可以通過GC自動回收無用的內存,但是代碼不好的話仍然存在內存溢出的風險。 

一、為什么要了解內存泄露和內存溢出?

1、內存泄露一般是代碼設計存在缺陷導致的,通過了解內存泄露的場景,可以避免不必要的內存溢出和提高自己的代碼編寫水平;

2、通過了解內存溢出的幾種常見情況,可以在出現內存溢出的時候快速的定位問題的位置,縮短解決故障的時間。 

 二、基本概念 

理解這兩個概念非常重要。

內存泄露:指程序中動態(tài)分配內存給一些臨時對象,但是對象不會被GC所回收,它始終占用內存。即被分配的對象可達但已無用。 

內存溢出:指程序運行過程中無法申請到足夠的內存而導致的一種錯誤。內存溢出通常發(fā)生于OLD段或Perm段垃圾回收后,仍然無內存空間容納新的Java對象的情況。

從定義上可以看出內存泄露是內存溢出的一種誘因,不是唯一因素。 

三、內存泄露的幾種場景:

1、長生命周期的對象持有短生命周期對象的引用 

            這是內存泄露最常見的場景,也是代碼設計中經常出現的問題。

            例如:在全局靜態(tài)map中緩存局部變量,且沒有清空操作,隨著時間的推移,這個map會越來越大,造成內存泄露。 

2、修改hashset中對象的參數值,且參數是計算哈希值的字段

             當一個對象被存儲進HashSet集合中以后,就不能修改這個對象中的那些參與計算哈希值的字段,否則對象修改后的哈希值與最初存儲進HashSet集合中時的哈希值就不同了,在這種情況下,即使在contains方法使用該對象的當前引用作為參數去HashSet集合中檢索對象,也將返回找不到對象的結果,這也會導致無法從HashSet集合中刪除當前對象,造成內存泄露。 

3、機器的連接數和關閉時間設置 

            長時間開啟非常耗費資源的連接,也會造成內存泄露。 

 四、內存溢出的幾種情況: 

1、堆內存溢出(outOfMemoryError:java heap space)

       在jvm規(guī)范中,堆中的內存是用來生成對象實例和數組的。

       如果細分,堆內存還可以分為年輕代和年老代,年輕代包括一個eden區(qū)和兩個survivor區(qū)。

       當生成新對象時,內存的申請過程如下:

          a、jvm先嘗試在eden區(qū)分配新建對象所需的內存;

          b、如果內存大小足夠,申請結束,否則下一步;

          c、jvm啟動youngGC,試圖將eden區(qū)中不活躍的對象釋放掉,釋放后若Eden空間仍然不足以放入新對象,則試圖將部分Eden中活躍對象放入Survivor區(qū);

          d、Survivor區(qū)被用來作為Eden及old的中間交換區(qū)域,當OLD區(qū)空間足夠時,Survivor區(qū)的對象會被移到Old區(qū),否則會被保留在Survivor區(qū);

          e、 當OLD區(qū)空間不夠時,JVM會在OLD區(qū)進行full GC;

          f、full GC后,若Survivor及OLD區(qū)仍然無法存放從Eden復制過來的部分對象,導致JVM無法在Eden區(qū)為新對象創(chuàng)建內存區(qū)域,則出現”out of memory錯誤”:

                                   outOfMemoryError:java heap space 

代碼舉例:

/** 
 * 堆內存溢出 
 * 
 * jvm參數:-Xms5m -Xmx5m -Xmn2m -XX:NewSize=1m 
 * 
 */ 
public class MemoryLeak { 
   
  private String[] s = new String[1000]; 
  
  public static void main(String[] args) throws InterruptedException { 
    Map<String,Object> m =new HashMap<String,Object>(); 
    int i =0; 
    int j=10000; 
    while(true){ 
      for(;i<j;i++){ 
        MemoryLeak memoryLeak = new MemoryLeak(); 
        m.put(String.valueOf(i), memoryLeak); 
      } 
    } 
  } 
} 

      2、方法區(qū)內存溢出(outOfMemoryError:permgem space)

       在jvm規(guī)范中,方法區(qū)主要存放的是類信息、常量、靜態(tài)變量等。

       所以如果程序加載的類過多,或者使用反射、gclib等這種動態(tài)代理生成類的技術,就可能導致該區(qū)發(fā)生內存溢出,一般該區(qū)發(fā)生內存溢出時的錯誤信息為:
             outOfMemoryError:permgem space 

代碼舉例:

1.jvm參數:-XX:PermSize=2m -XX:MaxPermSize=2m  

2.將方法區(qū)的大小設置很低即可,在啟動加載類庫時就會出現內存不足的情況   

3、線程棧溢出(java.lang.StackOverflowError)

       線程棧時線程獨有的一塊內存結構,所以線程棧發(fā)生問題必定是某個線程運行時產生的錯誤。

       一般線程棧溢出是由于遞歸太深或方法調用層級過多導致的。

       發(fā)生棧溢出的錯誤信息為:

              java.lang.StackOverflowError

代碼舉例:

/** 
 * 線程操作棧溢出 
 * 
 * 參數:-Xms5m -Xmx5m -Xmn2m -XX:NewSize=1m -Xss64k 
 * 
 */ 
public class StackOverflowTest { 
   
  public static void main(String[] args) { 
    int i =0; 
    digui(i); 
  } 
  private static void digui(int i){ 
    System.out.println(i++); 
    String[] s = new String[50]; 
    digui(i); 
  } 
} 

五、為了避免內存泄露,在編寫代碼的過程中可以參考下面的建議: 

1、盡早釋放無用對象的引用 

2、使用字符串處理,避免使用String,應大量使用StringBuffer,每一個String對象都得獨立占用內存一塊區(qū)域 

3、盡量少用靜態(tài)變量,因為靜態(tài)變量存放在永久代(方法區(qū)),永久代基本不參與垃圾回收 

4、避免在循環(huán)中創(chuàng)建對象

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

總結

以上所述是小編給大家介紹的Java內存溢出和內存泄露,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

相關文章

  • SpringBoot @Test單元測試方式

    SpringBoot @Test單元測試方式

    這篇文章主要介紹了SpringBoot @Test單元測試方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • SpringBoot打jar包遇到的xml文件丟失的解決方案

    SpringBoot打jar包遇到的xml文件丟失的解決方案

    這篇文章主要介紹了SpringBoot打jar包遇到的xml文件丟失的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java動態(tài)追蹤技術探究之從JSP到Arthas

    Java動態(tài)追蹤技術探究之從JSP到Arthas

    這篇文章主要介紹了Java動態(tài)追蹤技術探究之從JSP到Arthas,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,,需要的朋友可以參考下
    2019-06-06
  • SpringMVC 重新定向redirect請求中攜帶數據方式

    SpringMVC 重新定向redirect請求中攜帶數據方式

    這篇文章主要介紹了SpringMVC 重新定向redirect請求中攜帶數據方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 如何解決@Valid對象嵌套List對象校驗無效問題

    如何解決@Valid對象嵌套List對象校驗無效問題

    這篇文章主要介紹了如何解決@Valid對象嵌套List對象校驗無效問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java實現markdown格式內容轉換為word

    Java實現markdown格式內容轉換為word

    這篇文章主要為大家簡單介紹了如何利用Java實現markdown格式內容轉換為word文檔,文中的示例代碼簡潔易懂,有需要的小伙伴可以參考一下
    2025-03-03
  • MyBatis使用動態(tài)SQL標簽的小陷阱

    MyBatis使用動態(tài)SQL標簽的小陷阱

    MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架,MyBatis越來越受大家的喜愛了。下面給大家分享MyBatis使用動態(tài)SQL標簽的小陷阱,感興趣的朋友一起看看吧
    2016-10-10
  • Java靜態(tài)代理和動態(tài)代理的深入講解

    Java靜態(tài)代理和動態(tài)代理的深入講解

    這篇文章主要給大家介紹了關于Java靜態(tài)代理和動態(tài)代理的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • Springboot中整合knife4j接口文檔的過程詳解

    Springboot中整合knife4j接口文檔的過程詳解

    knife4j就swagger的升級版API文檔的一個框架,但是用起來比swagger方便多了,UI更加豐富,這篇文章主要介紹了Springboot中整合knife4j接口文檔,需要的朋友可以參考下
    2022-04-04
  • Java基礎詳解之集合框架工具Collections

    Java基礎詳解之集合框架工具Collections

    這篇文章主要介紹了Java基礎詳解之集合框架工具Collections,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-04-04

最新評論

万宁市| 周宁县| 连山| 齐河县| 商河县| 临夏市| 汉阴县| 昆山市| 莱西市| 咸丰县| 修武县| 汾阳市| 昭苏县| 囊谦县| 富源县| 百色市| 苍山县| 车致| 玉溪市| 资溪县| 南通市| 富源县| 夏津县| 乌恰县| 栾川县| 阿荣旗| 古丈县| 定南县| 金川县| 来安县| 柞水县| 苏尼特右旗| 英超| 栖霞市| 雅安市| 庆城县| 桦南县| 资兴市| 渭南市| 大安市| 峨眉山市|