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

Java內(nèi)存溢出和內(nèi)存泄露

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

雖然jvm可以通過(guò)GC自動(dòng)回收無(wú)用的內(nèi)存,但是代碼不好的話仍然存在內(nèi)存溢出的風(fēng)險(xiǎn)。 

一、為什么要了解內(nèi)存泄露和內(nèi)存溢出?

1、內(nèi)存泄露一般是代碼設(shè)計(jì)存在缺陷導(dǎo)致的,通過(guò)了解內(nèi)存泄露的場(chǎng)景,可以避免不必要的內(nèi)存溢出和提高自己的代碼編寫水平;

2、通過(guò)了解內(nèi)存溢出的幾種常見(jiàn)情況,可以在出現(xiàn)內(nèi)存溢出的時(shí)候快速的定位問(wèn)題的位置,縮短解決故障的時(shí)間。 

 二、基本概念 

理解這兩個(gè)概念非常重要。

內(nèi)存泄露:指程序中動(dòng)態(tài)分配內(nèi)存給一些臨時(shí)對(duì)象,但是對(duì)象不會(huì)被GC所回收,它始終占用內(nèi)存。即被分配的對(duì)象可達(dá)但已無(wú)用。 

內(nèi)存溢出:指程序運(yùn)行過(guò)程中無(wú)法申請(qǐng)到足夠的內(nèi)存而導(dǎo)致的一種錯(cuò)誤。內(nèi)存溢出通常發(fā)生于OLD段或Perm段垃圾回收后,仍然無(wú)內(nèi)存空間容納新的Java對(duì)象的情況。

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

三、內(nèi)存泄露的幾種場(chǎng)景:

1、長(zhǎng)生命周期的對(duì)象持有短生命周期對(duì)象的引用 

            這是內(nèi)存泄露最常見(jiàn)的場(chǎng)景,也是代碼設(shè)計(jì)中經(jīng)常出現(xiàn)的問(wèn)題。

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

2、修改hashset中對(duì)象的參數(shù)值,且參數(shù)是計(jì)算哈希值的字段

             當(dāng)一個(gè)對(duì)象被存儲(chǔ)進(jìn)HashSet集合中以后,就不能修改這個(gè)對(duì)象中的那些參與計(jì)算哈希值的字段,否則對(duì)象修改后的哈希值與最初存儲(chǔ)進(jìn)HashSet集合中時(shí)的哈希值就不同了,在這種情況下,即使在contains方法使用該對(duì)象的當(dāng)前引用作為參數(shù)去HashSet集合中檢索對(duì)象,也將返回找不到對(duì)象的結(jié)果,這也會(huì)導(dǎo)致無(wú)法從HashSet集合中刪除當(dāng)前對(duì)象,造成內(nèi)存泄露。 

3、機(jī)器的連接數(shù)和關(guān)閉時(shí)間設(shè)置 

            長(zhǎng)時(shí)間開(kāi)啟非常耗費(fèi)資源的連接,也會(huì)造成內(nèi)存泄露。 

 四、內(nèi)存溢出的幾種情況: 

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

       在jvm規(guī)范中,堆中的內(nèi)存是用來(lái)生成對(duì)象實(shí)例和數(shù)組的。

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

       當(dāng)生成新對(duì)象時(shí),內(nèi)存的申請(qǐng)過(guò)程如下:

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

          b、如果內(nèi)存大小足夠,申請(qǐng)結(jié)束,否則下一步;

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

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

          e、 當(dāng)OLD區(qū)空間不夠時(shí),JVM會(huì)在OLD區(qū)進(jìn)行full GC;

          f、full GC后,若Survivor及OLD區(qū)仍然無(wú)法存放從Eden復(fù)制過(guò)來(lái)的部分對(duì)象,導(dǎo)致JVM無(wú)法在Eden區(qū)為新對(duì)象創(chuàng)建內(nèi)存區(qū)域,則出現(xiàn)”out of memory錯(cuò)誤”:

                                   outOfMemoryError:java heap space 

代碼舉例:

/** 
 * 堆內(nèi)存溢出 
 * 
 * jvm參數(shù):-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ū)內(nèi)存溢出(outOfMemoryError:permgem space)

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

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

代碼舉例:

1.jvm參數(shù):-XX:PermSize=2m -XX:MaxPermSize=2m  

2.將方法區(qū)的大小設(shè)置很低即可,在啟動(dòng)加載類庫(kù)時(shí)就會(huì)出現(xiàn)內(nèi)存不足的情況   

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

       線程棧時(shí)線程獨(dú)有的一塊內(nèi)存結(jié)構(gòu),所以線程棧發(fā)生問(wèn)題必定是某個(gè)線程運(yùn)行時(shí)產(chǎn)生的錯(cuò)誤。

       一般線程棧溢出是由于遞歸太深或方法調(diào)用層級(jí)過(guò)多導(dǎo)致的。

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

              java.lang.StackOverflowError

代碼舉例:

/** 
 * 線程操作棧溢出 
 * 
 * 參數(shù):-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); 
  } 
} 

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

1、盡早釋放無(wú)用對(duì)象的引用 

2、使用字符串處理,避免使用String,應(yīng)大量使用StringBuffer,每一個(gè)String對(duì)象都得獨(dú)立占用內(nèi)存一塊區(qū)域 

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

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

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

總結(jié)

以上所述是小編給大家介紹的Java內(nèi)存溢出和內(nèi)存泄露,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • SpringBoot @Test單元測(cè)試方式

    SpringBoot @Test單元測(cè)試方式

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

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

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

    Java動(dòng)態(tài)追蹤技術(shù)探究之從JSP到Arthas

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

    SpringMVC 重新定向redirect請(qǐng)求中攜帶數(shù)據(jù)方式

    這篇文章主要介紹了SpringMVC 重新定向redirect請(qǐng)求中攜帶數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 如何解決@Valid對(duì)象嵌套List對(duì)象校驗(yàn)無(wú)效問(wèn)題

    如何解決@Valid對(duì)象嵌套List對(duì)象校驗(yàn)無(wú)效問(wèn)題

    這篇文章主要介紹了如何解決@Valid對(duì)象嵌套List對(duì)象校驗(yàn)無(wú)效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java實(shí)現(xiàn)markdown格式內(nèi)容轉(zhuǎn)換為word

    Java實(shí)現(xiàn)markdown格式內(nèi)容轉(zhuǎn)換為word

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

    MyBatis使用動(dòng)態(tài)SQL標(biāo)簽的小陷阱

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

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

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

    Springboot中整合knife4j接口文檔的過(guò)程詳解

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

    Java基礎(chǔ)詳解之集合框架工具Collections

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

最新評(píng)論

桦甸市| 凤城市| 西昌市| 寻甸| 罗平县| 黑河市| 庄河市| 遵义市| 肥东县| 资溪县| 毕节市| 大石桥市| 若尔盖县| 探索| 义马市| 正安县| 肇东市| 和硕县| 镇宁| 临武县| 琼海市| 廉江市| 社旗县| 刚察县| 论坛| 开平市| 沽源县| 玉山县| 措勤县| 宝丰县| 晴隆县| 林西县| 济阳县| 博客| 雷州市| 湘阴县| 江陵县| 临沧市| 嘉鱼县| 佛学| 海原县|