欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JVM內(nèi)存溢出和內(nèi)存泄漏的區(qū)別及說明

 更新時間:2024年02月01日 09:00:24   作者:Sharley  
這篇文章主要介紹了JVM內(nèi)存溢出和內(nèi)存泄漏的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

1、概念的區(qū)分

1.1、 內(nèi)存泄露(memory leak)

程序運行結(jié)束后,沒有釋放 所占用的內(nèi)存空間。

一次內(nèi)存泄漏 似乎不會有大的影響,但內(nèi)存泄漏 不斷累積,最終可用內(nèi)存會變得越來越少。

比如說,總內(nèi)存大小是100 MB,有40MB的內(nèi)存一直無法回收,那么可用的只有60MB 。這40MB的就是內(nèi)存泄漏。

內(nèi)存泄漏,就是程序運行結(jié)束后,沒有釋放的內(nèi)存。

1.2、內(nèi)存溢出(out of memory)

程序運行時,在申請內(nèi)存空間時,沒有足夠的內(nèi)存空間供其正常使用,程序運行停止,并拋出 out of memory 。

比如程序運行時申請了一個10MB 空間, 但是當(dāng)前可用內(nèi)存只有5MB,程序無法正常執(zhí)行,這就是內(nèi)存溢出。

 內(nèi)存溢出 ,可以理解為程序運行需要的內(nèi)存大于當(dāng)前可用的內(nèi)存。

1.3 舉例

(1)單例模式中,單例的生命周期和應(yīng)用程序是一樣長的,所以單例程序中如果持有對外部對象的引用的話,那么這個外部對象是不能被回收的,則會導(dǎo)致 內(nèi)存泄露 的產(chǎn)生。

(2)一些提供close的資源未閉導(dǎo)致 內(nèi)存泄漏 。數(shù)據(jù)庫連接(dataSource.getConnection() ),網(wǎng)絡(luò)連接(socket)和 IO流的連接必須在finally中 close,否則不能被回收的。

(3)讀取大文件,一次讀取的文件大于可用內(nèi)存,會導(dǎo)致 內(nèi)存溢出 。可用內(nèi)存是1G,怎么讀取2G的文件呢?建一個100MB的字節(jié)數(shù)組,讀10次。

2、二者的區(qū)別和聯(lián)系

2.1 區(qū)別

內(nèi)存泄露: 程序運行結(jié)束后,所占用的內(nèi)存沒有全部釋放。

內(nèi)存溢出:程序運行時,需要的內(nèi)存大于當(dāng)前可用的內(nèi)存,內(nèi)存不足,程序無法繼續(xù)執(zhí)行,拋出 “內(nèi)存溢出”,程序運行中斷,結(jié)束。

2.2 聯(lián)系

一次 內(nèi)存泄露 可能對程序運行沒有明顯的影響,多次 內(nèi)存泄露 最終會導(dǎo)致 內(nèi)存溢出 。

比如總內(nèi)存大小是100MB,一次程序運行結(jié)束有,有10MB 沒有釋放,當(dāng)前可用內(nèi)存還有90MB,程序還可以運行。但是多次運行后, 可用內(nèi)存 最終為0, 沒有可以內(nèi)存或內(nèi)存不足時,程序在下一次運行時,會因為內(nèi)存不足,而出現(xiàn) 內(nèi)存溢出 。

3、內(nèi)存溢出的原因以及解決方法

3.1 內(nèi)存溢出的原因

引起內(nèi)存溢出的原因有很多種,小編列舉一下常見的有以下幾種:

  • 內(nèi)存中加載的數(shù)據(jù)量過于龐大,如一次從數(shù)據(jù)庫取出過多數(shù)據(jù);
  • 集合類中有對對象的引用,使用完后未清空,使得JVM不能回收;
  • 代碼中存在死循環(huán)或循環(huán)產(chǎn)生過多重復(fù)的對象實體;
  • 使用的第三方軟件中的BUG;啟動參數(shù)內(nèi)存值設(shè)定的過小 。

3.2 內(nèi)存溢出的解決方案

第一步,修改JVM啟動參數(shù),直接增加內(nèi)存。(-Xms、-Xmx 參數(shù)一定不要忘記加)

第二步,檢查錯誤日志,查看 “OutOfMemory” 錯誤前是否有其它異?;蝈e誤。

第三步,對代碼進行走查和分析,找出可能發(fā)生內(nèi)存溢出的位置。

重點排查以下幾點:

1.檢查對數(shù)據(jù)庫查詢中,是否有一次獲得全部數(shù)據(jù)的查詢。

  • 一般來說,如果一次取十萬條記錄到內(nèi)存,就可能引起內(nèi)存溢出。
  • 這個問題比較隱蔽,在上線前,數(shù)據(jù)庫中數(shù)據(jù)較少,不容易出問題,上線后,
  • 數(shù)據(jù)庫中數(shù)據(jù)多了,一次查詢就有可能引起內(nèi)存溢出。因此對于數(shù)據(jù)庫查詢盡量采用分頁的方式查詢。

2.檢查代碼中是否有死循環(huán)或遞歸調(diào)用。 

3.檢查是否有大循環(huán)重復(fù)產(chǎn)生新對象實體。

4.檢查對數(shù)據(jù)庫查詢中,是否有一次獲得全部數(shù)據(jù)的查詢。

  • 一般來說,如果一次取十萬條記錄到內(nèi)存,就可能引起內(nèi)存溢出。
  • 這個問題比較隱蔽,在上線前,數(shù)據(jù)庫中數(shù)據(jù)較少,不容易出問題,
  • 上線后,數(shù)據(jù)庫中數(shù)據(jù)多了,一次查詢就有可能引起內(nèi)存溢出。因此對于數(shù)據(jù)庫查詢盡量采用分頁的方式查詢。

5.檢查List、MAP等集合對象是否有使用完后,未清除的問題。

List、MAP等集合對象會始終存有對對象的引用,使得這些對象不能被GC回收。

第四步,使用內(nèi)存查看工具動態(tài)查看內(nèi)存使用情況。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot中并發(fā)定時任務(wù)的實現(xiàn)、動態(tài)定時任務(wù)的實現(xiàn)(看這一篇就夠了)推薦

    SpringBoot中并發(fā)定時任務(wù)的實現(xiàn)、動態(tài)定時任務(wù)的實現(xiàn)(看這一篇就夠了)推薦

    這篇文章主要介紹了SpringBoot并發(fā)定時任務(wù)動態(tài)定時任務(wù)實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java中BeanUtils.copyProperties的11個坑總結(jié)

    Java中BeanUtils.copyProperties的11個坑總結(jié)

    我們?nèi)粘i_發(fā)中,經(jīng)常涉及到DO、DTO、VO對象屬性拷貝賦值,很容易想到org.springframework.beans.BeanUtils的copyProperties,它會自動通過反射機制獲取源對象和目標(biāo)對象的屬性,pyProperties,會有好幾個坑呢,本文將給大家總結(jié)一下遇到的坑,需要的朋友可以參考下
    2023-05-05
  • Java多線程并發(fā)與并行和線程與進程案例

    Java多線程并發(fā)與并行和線程與進程案例

    這篇文章主要介紹了Java多線程并發(fā)與并行和線程與進程案例,文章基于Java的相關(guān)資料展開詳細(xì)的內(nèi)容介紹,具有一定的參考價價值,需要的小伙伴可以參考一下
    2022-06-06
  • BeanUtils.copyProperties()所有的空值不復(fù)制問題

    BeanUtils.copyProperties()所有的空值不復(fù)制問題

    這篇文章主要介紹了BeanUtils.copyProperties()所有的空值不復(fù)制問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java中的CompletableFuture使用解析

    Java中的CompletableFuture使用解析

    這篇文章主要介紹了Java中的CompletableFuture使用解析,為什么CompletableFuture要定制化線程池,因為默認(rèn)的線程池是ForkJoinPool,這個線程池的最大線程數(shù)默認(rèn)是你的電腦的線程數(shù)數(shù)減1,假如我線程電腦是4核8線程的,ForkJoinPool的最大線程數(shù)就是7,需要的朋友可以參考下
    2024-01-01
  • Java?Thread.currentThread().getName()?和?this.getName()區(qū)別詳解

    Java?Thread.currentThread().getName()?和?this.getName()區(qū)別詳

    本文主要介紹了Thread.currentThread().getName()?和?this.getName()區(qū)別詳解,TestThread?testThread?=?new?TestThread();
    2022-02-02
  • 使用XSD校驗Mybatis的SqlMapper配置文件的方法(1)

    使用XSD校驗Mybatis的SqlMapper配置文件的方法(1)

    這篇文章以前面對SqlSessionFactoryBean的重構(gòu)為基礎(chǔ),簡單的介紹了相關(guān)操作知識,然后在給大家分享使用XSD校驗Mybatis的SqlMapper配置文件的方法,感興趣的朋友參考下吧
    2016-11-11
  • springBoot的事件機制GenericApplicationListener用法解析

    springBoot的事件機制GenericApplicationListener用法解析

    這篇文章主要介紹了springBoot的事件機制GenericApplicationListener用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值的相關(guān)資料
    2019-09-09
  • 如何使用@Slf4j和logback-spring.xml搭建日志框架

    如何使用@Slf4j和logback-spring.xml搭建日志框架

    這篇文章主要介紹了如何使用@Slf4j和logback-spring.xml搭建日志框架問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java實例講解文件上傳與跨域問題

    Java實例講解文件上傳與跨域問題

    這篇文章主要介紹了Java文件上傳與跨域問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09

最新評論