内存泄漏和内存溢出的区别

参考答案

  • 内存溢出(out of memory):指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory。
  • 内存泄露(memory leak):指程序在申请内存后,无法释放已申请的内存空间,内存泄露堆积会导致内存被占光。
  • memory leak 最终会导致 out of memory。

 1、概念的区分

1.1、 内存泄露 memory leak

程序运行结束后,没有释放 所占用的内存空间。
一次内存泄漏 似乎不会有大的影响,但内存泄漏 不断累积,最终可用内存会变得越来越少。

 

 比如说,总内存大小是100 MB,有40MB的内存一直无法回收,那么可用的只有60MB 。这40MB的就是内存泄漏。
内存泄漏,就是 程序运行结束后,没有释放的内存。

 1.2、 内存溢出 out of memory

 程序运行时,在申请内存空间时,没有足够的内存空间供其正常使用,程序运行停止,并抛出 out of memory 
比如程序运行时申请了一个10MB 空间, 但是当前可用内存只有5MB,程序无法正常执行,这就是内存溢出。

 

 内存溢出 ,可以理解为 程序运行需要的内存 大于当前可用的内存。

 

1.3 举例


1)单例模式中,单例的生命周期和应用程序是一样长的,所以单例程序中如果持有对外部对象的引用的话,那么这个外部对象是不能被回收的,则会导致 内存泄露 的产生。

2)一些提供close的资源未闭导致 内存泄漏 。数据库连接(dataSource.getConnection() ),网络连接(socket)和 IO流的连接必须在finally中 close,否则不能被回收的。

3)读取大文件,一次读取的文件大于可用内存,会导致 内存溢出 。可用内存是1G,怎么读取2G的文件呢?建一个100MB的字节数组,读10次。

 

2、二者的区别和联系:


2.1、区别
内存泄露: 程序运行结束后,所占用的内存没有全部释放。
内存溢出:程序运行时,需要的内存大于当前可用的内存, 内存不足,程序无法继续执行,抛出 “内存溢出”,程序运行中断,结束。

2.2、联系
一次 内存泄露 可能对程序运行没有明显的影响,多次 内存泄露 最终会导致 内存溢出 。

比如总内存大小是100MB,一次程序运行结束有,有10MB 没有释放,当前 可用内存 还有90MB,程序还可以运行。但是多次运行后, 可用内存 最终为0, 没有可以内存或内存不足时,程序在下一次运行时,会因为内存不足,而出现 内存溢出 。

 3、内存溢出的原因以及解决方法

 

3.1、内存溢出的原因


引起内存溢出的原因有很多种,小编列举一下常见的有以下几种:

内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
代码中存在死循环或循环产生过多重复的对象实体;
使用的第三方软件中的BUG;
启动参数内存值设定的过小 。

 3.2、内存溢出的解决方案:

第一步,修改JVM启动参数,直接增加内存。( -Xms 、 -Xmx 参数一定不要忘记加)

第二步,检查错误日志,查看 “OutOfMemory” 错误前是否有其它异常或错误。

第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。

 重点排查以下几点:

 

1.检查对数据库查询中,是否有一次获得全部数据的查询。
	一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。
	这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,
	数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
 
2.检查代码中是否有死循环或递归调用。
 
3.检查是否有大循环重复产生新对象实体。
 
4.检查对数据库查询中,是否有一次获得全部数据的查询。
	一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。
	这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,
	上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
 
5.检查List、MAP等集合对象是否有使用完后,未清除的问题。
	List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

第四步,使用内存查看工具动态查看内存使用情况。Jmap获取内存堆信息/arthas在线分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/3174.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式开发常用的三种通信协议串口通信、SPI和IIC

常用的三种通信协议串口通信、SPI和IIC 文章目录常用的三种通信协议串口通信、SPI和IIC一、通信分类1.1.同步通信和异步通信1.2.单工通信、半双工通信和全双工通信1.3.串行通信与并行通信二、串口通信2.1.UART2.2.RS232通信2.3.RS485通信三、SPI通信四、IIC通信一、通信分类 1…

【Linux】虚拟地址空间

进程地址空间一、引入二、虚拟地址与物理内存的联系三、为什么要有虚拟地址空间一、引入 对于C/C程序,我们眼中的内存是这样的: 我们利用这种对于与内存的理解看一下下面这段代码: 运行结果: 观察父子进程中 val 变量的值&…

深度学习:GPT1、GPT2、GPT-3

深度学习:GPT1、GPT2、GPT3的原理与模型代码解读GPT-1IntroductionFramework自监督学习微调ExperimentGPT-2IntroductionApproachConclusionGPT-3GPT-1 Introduction GPT-1(Generative Pre-training Transformer-1)是由OpenAI于2018年发布的…

多线程 (九) 线程池的使用及实现

🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!人生格言:当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔🦾&am…

若依框架---权限管理设计

前言 若依权限管理包含两个部分:菜单权限 和 数据权限。菜单权限控制着我们可以执行哪些操作。数据权限控制着我们可以看到哪些数据。 菜单是一个概括性名称,可以细分为目录、菜单和按钮,以若依自身为例: 目录,就是页…

C++三种继承方式

C继承的一般语法为:class 派生类名:[继承方式] 基类名{派生类新增加的成员};继承方式限定了基类成员在派生类中的访问权限,包括 public(公有的)、private(私有的)和 protected&#…

Github学生包申请秒过经验并使用Copilot

写在前面 前提是在校学生,且有学校邮箱,当然你也得有Github账户前往学信网下载 教育部学籍在线验证报告将报告转换成英文版本,我用的是手机夸克自带的拍照翻译功能 具体流程 设置Github个人信息 来到 https://github.com/settings/profil…

【linux】进程信号——信号的保存和处理

文章目录一、阻塞信号1.1 信号的相关概念1.2 在内核中的构成二、捕捉信号概念2.1 内核态和用户态2.2 信号捕捉流程图三、信号操作3.1 sigset_t信号集3.2 信号集操作函数3.2.1 更改block表sigprocmask3.2.2 获取pending信号集sigpending3.3 验证四、捕捉信号操作4.1 内核捕捉信号…

样本量很少如何获得最佳的效果?最新小样本学习工具包来啦!

原文:样本量很少如何获得最佳的效果?最新小样本学习工具包来啦! 开发者简介 王雅晴,PaddleFSL负责人、飞桨高级开发者技术专家(高级PPDE)。2019年毕业于香港科技大学计算机科学及工程学系。通过百度公司A…

基于Golang实现多人在线游戏的AOI算法

1、AOI基本介绍 游戏的AOI(Area of Interest)算法应该算作游戏的基础核心了,许多逻辑都是因为AOI进出事件驱动的,许多网络同步数据也是因为AOI进出事件产生的。因此,良好的AOI算法和基于AOI算法的优化,是提高游戏性能的关键。 为…

java如何手动导jar包

今天用IDEA,需要导入一个Jar包,因为以前都是用eclipse的,所以对这个idea还不怎么上手,连打个Jar包都是谷歌了一下。 但是发现网上谷歌到的做法一般都是去File –> Project Structure中去设置,有没有如同eclipse一样…

HTTP/2.x:最新的网页加载技术,快速提高您的SEO排名

2.1 http2概念HTTP/2.0(又称HTTP2)是HTTP协议的第二个版本。它是对HTTP/1.x的更新,旨在提高网络性能和安全性。HTTP/2.0是由互联网工程任务组(IETF)标准化的,并于2015年发布。2.2 http2.x与http1.x区别HTTP…

如何在 Vue 中使用 防抖 和 节流

大厂面试题分享 面试题库前后端面试题库 (面试必备) 推荐:★★★★★地址:前端面试题库 https://mp.weixin.qq.com/s?__bizMzU5NzA0NzQyNg&mid2247485824&idx3&sn70cd26a7c0c683de64802f6cb9835003&scene21#wech…

Flutter GetX 实现 ChatGPT 简单聊天界面

Flutter 是一款跨平台的移动应用开发框架,而 GetX 是 Flutter 中一种简单易用的状态管理和路由管理工具。本篇我们将使用 Flutter 和 GetX 实现一个简单的聊天界面,以与 ChatGPT 进行交互。 我们需要在 Flutter 项目中引入 GetX 库。在pubspec.yaml文件…

学大数据算跟风吗?

随着互联网、物联网和人工智能等技术的不断发展,大数据技术逐渐进入人们的视野,成为一个备受关注的热点话题。那么,大数据专业好学吗?前景如何?下面我们来一起探讨一下。 一、大数据专业的学习难度 大数据技术是一种综…

八大排序算法之归并排序(递归实现+非递归实现)

目录 一.归并排序的基本思想 归并排序算法思想(排升序为例) 二.两个有序子序列(同一个数组中)的归并(排升序) 两个有序序列归并操作代码: 三.归并排序的递归实现 递归归并排序的实现:(后序遍历递归) 递归函数抽象分析: 四.非递归归并排序的实现 1.非递归归并排序算法…

全景丨0基础学习VR全景制作,后期篇第九章:控制点和遮罩工具

本节教程,我们介绍拼接软件PTGui Pro 矫正拉直全景图水平的方法。矫正拉直全景图可以通过后期软件PTGui做到,但我更想跟大家强调的是前期拍摄时,查看水平仪,调平三脚架尤为重要。后期软件强行矫正,不可避免的会因为追求…

蓝桥杯Web前端练习题-----水果拼盘

一、水果拼盘 介绍 目前 CSS3 中新增的 Flex 弹性布局已经成为前端页面布局的首选方案,本题可以使用 Flex 属性快速完成布局。 准备 开始答题前,需要先打开本题的项目代码文件夹,目录结构如下: ├── css │ └── style.…

acm省赛:高桥和低桥(三种做法:区间计数、树状数组、线段树)

题目描述 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上&#xff…

chatGPT爆火,什么时候中国能有自己的“ChatGPT“

目录 引言 一、ChatGPT爆火 二、中国何时能有自己的"ChatGPT" 三、为什么openai可以做出chatGPT? 四、结论 引言 随着人工智能技术的不断发展,自然语言处理技术也逐渐成为了研究的热点之一。其中,ChatGPT作为一项领先的自然语言处理技术…
最新文章