【Java】内存溢出和内存泄露的区别

目录

概念

内存溢出分类

内存泄漏分类

发生场景以及解决方法

内存溢出

内存泄漏

解决方法


这道题是面试常考的,一定要区分好区别,我之前就是直接认为内存溢出就是内存泄漏了

概念

内存溢出:是指程序在申请内存时,没有足够的内存空间供其使用。比如,申请了一个整数的内存,但实际存了一个需要 long 类型来存储的数,这就会导致内存溢出。系统无法满足程序需要的内存大小,导致溢出。

内存泄漏:是指程序在申请内存后,无法释放已申请的内存空间。虽然单个内存泄漏可能不会带来太大问题,但随着内存泄漏的积累,系统的可用内存空间会逐渐减少。就像一个容器只能装4个水果,但你却放了5个,结果溢出并掉落在地上。内存泄漏最终可能会导致内存耗尽,也就是内存溢出。

内存溢出分类

  1. PermGen Space

    • PermGen(Permanent Generation)是指JVM内存的永久保存区域,存放类和Meta信息。这个区域不同于存放实例的Heap区域,且在运行期间GC不会对其进行清理。如果应用中有大量的Class信息,就可能出现PermGen Space错误。
    • 比如,在Web服务器中对JSP进行precompile时,或者应用中使用了大量第三方jar文件超出默认大小(4M)都可能导致此错误。
  2. Java Heap Space

    • Java Heap是用于存储实例对象的内存区域。默认情况下,其大小为物理内存的1/64,最大空间为物理内存的1/4。如果内存剩余不到40%,JVM会增大堆到最大设置值,超过70%,则会减小堆到最小设置值。
    • 通常,Xmx和Xms设置相同避免频繁调整虚拟机堆的大小。如果Xms超过了Xmx值,或者堆和非堆的总和超过了物理内存限制都会导致启动问题。

内存泄漏分类

  1. 常发性内存泄漏:代码重复执行导致内存泄漏。
  2. 偶发性内存泄漏:在特定环境或操作过程下才会发生的内存泄漏。
  3. 一次性内存泄漏:发生一次或由于算法上的缺陷导致总会有一块内存泄漏。
  4. 隐式内存泄漏:程序运行过程中不断分配内存,但最终才释放,可能最终耗尽系统所有内存。

发生场景以及解决方法

内存溢出

内存溢出通常由以下原因引起:

  1. 过多数据加载:从数据库等源加载大量数据到内存可能引发溢出。
  2. 未清空集合中的对象引用:集合中对象引用未被清空,导致JVM无法回收。
  3. 死循环或对象重复创建:存在代码中的无限循环或重复创建大量对象。
  4. 第三方软件中的问题:使用的第三方软件存在bug导致内存溢出。
  5. 启动参数内存值设定过小:设置的启动参数不足以支持应用所需内存。

解决内存溢出的方法:

  1. 调整JVM启动参数:增加内存限制(使用 -Xms 和 -Xmx 参数)。
  2. 检查错误日志:查看 "OutOfMemory" 错误前是否有其他异常或错误。
  3. 代码审查和分析:检查可能导致内存溢出的代码部分。

具体排查重点:

  1. 数据查询优化:避免一次性加载过多数据库数据,尤其使用分页查询方式。
  2. 死循环和递归调用:审查代码中是否存在无限循环或过度递归。
  3. 对象重复创建:检查代码,确保大循环未创建大量重复对象。
  4. 集合对象引用清除:确认集合对象在使用完后进行清除,避免持有无用对象的引用。
  5. 动态内存查看工具:使用内存查看工具实时监控和分析内存使用情况。

内存泄漏

具体排查重点:

检测工具

  • Valgrind和Dmalloc:这些工具能够跟踪内存的分配和释放,输出内存使用情况以及追踪错误,帮助发现潜在的内存泄漏。

日志记录

  • 记录内存申请和释放:在代码中添加日志记录,包括内存的申请、释放以及使用情况。观察日志可以发现潜在的内存泄漏。

性能分析器

  • gprof和perf:这些性能分析工具可以识别性能瓶颈和内存使用情况,用于检测内存泄漏问题。

解决方法

  • 智能指针的使用:采用智能指针(如std::shared_ptr或std::unique_ptr)来管理内存,自动释放内存并避免泄漏。
  • 手动释放内存:在代码中手动添加释放内存的语句,确保每次申请的内存都得到释放。
  • 定期清理缓存:缓存、连接池等容易导致泄漏,定期清理这些资源可以有效避免内存泄漏。
  • 增加内存判断:在程序中增加内存判断的代码,例如使用assert等断言库,确保内存的正确使用。

 

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

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

相关文章

国考省考行测:分析推理,形式逻辑,集合推理,真假推理

国考省考行测:分析推理,形式逻辑 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧,我讲一起屡屡申论和…

基于Springboot的视频网站系统的设计与实现(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的视频网站系统的设计与实现(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层…

git diff查看比对两次不同时间点提交的异同

git diff查看比对两次不同时间点提交的异同 用 git diff命令: git diff commit-id-1 commit-id-2 不同commit-id在不同的时间点提交产生,因为也可以认为git diff是比对两个不同时间点的代码异同。 git diff比较不同commit版本的代码文件异同_git diff c…

顺序表的奥秘:高效数据存储与检索

🍿顺序表 🧀1、顺序表的实现🍥1.1 创建顺序表类🍥1.2 插入操作🍥1.3 查找操作🍥1.4 删除操作🍥1.5 清空操作 🧀2、ArrayList的说明🧀3、ArrayList使用🍥3.1 A…

Focaler-IoU:更聚焦的IoU损失

摘要 边界框回归在目标检测领域中起着至关重要的作用,而目标检测的定位精度在很大程度上取决于边界框回归的损失函数。现有的研究通过利用边界框之间的几何关系来提高回归性能,而忽略了难易样本分布对边界框回归的影响。本文分析了难易样本分布对回归结…

在linux上进行编译调试

1.相关疑问 1. 为什么在代码里使用了一个未定义过的函数(如add()),在编译阶段不会报错,在链接阶段会报错呢? 答:先说几个代码编译的结论: 单个\.c源文件文件被编译成机器码文件时&#xff0c…

DC-Windows备份(23国赛真题)

2023全国职业院校技能大赛网络系统管理赛项–模块B:服务部署(WindowServer2022) 文章目录 题目配置步骤在DC1上备份系统状态到D:\共享文件夹所有用户具有读/写权限验证查看DC1备份成功的截图在InsideCli上查看备份文件(查看文件夹安全属性)题目 在DC1上备份系统状态到D:\,…

Linux实验记录:使用firewalld

前言: 本文是一篇关于Linux系统初学者的实验记录。 参考书籍:《Linux就该这么学》 实验环境: VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注: RHEL8系统中集成了多款防火墙管理工具&#xf…

Qt之QLabel介绍

概述 QLabel是QT界面中的标签类,它从QFrame下继承,QLabel 类代表标签,它是一个用于显示文本或图像的窗口部件。我们主要介绍一下QLabel的一些简单的使用。 设置颜色背景色和字体的颜色大小 字体及颜色 设置文字使用的是setText函数。 QStri…

一文彻底搞懂redis数据结构及应用

文章目录 1. Redis介绍2.五种基本类型2.1 String字符串2.2 List列表2.3 Set集合2.4 Zset有序集合2.5 Hash散列 3. 三种基本类型3.1 Bitmap (位存储)3.2 HyperLogLogs(基数统计)3.3 geospatial (地理位置) 4. Stream详解4.1 Stream…

小土堆pytorch学习笔记002

目录 1、TensorBoard的使用 (1)显示坐标: (2)显示图片: 2、Transform的使用 3、常见的Transforms (1)#ToTensor() (2)# Normalize() (3&…

Java基础—面向对象—19static关键字详解、抽象类、接口、N种内部类

1、static关键字 匿名代码块、静态代码块、构造方法 静态代码块是在类加载的时候执行,仅执行一次 匿名代码块在调用构造函数之前 验证如下图: 2、静态导入包(可能很多人听都没听过) 3、Math是用final关键字的,fina…

Mybatis-Plus扩展

7 MybatisX插件[扩展] 7.1 MybatisX插件介绍 MybatisX 是一款基于 IDEA 的快速开发插件,为效率而生。 安装方法:打开 IDEA,进入 File -> Settings -> Plugins -> Browse Repositories,输入 mybatisx 搜索并安装。 功…

【Midjourney】如何自定义一套参数

使用Midjourney有时候会遇到需要调整某些参数的时候,例如宽高之类的: --hd --ar 7:4 而Midjourney中提供了一条指令用于自定义一套参数方便重复使用。 以下指令创建一个名为“mine”的选项,翻译过来就是 --hd --ar 7:4: 创建成功后会有类似…

112. 路径总和详解!!三种解法,总有一款适合你(Java)

513.找树左下角的值 题目链接:513. 找树左下角的值 BFS(迭代)法: /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNod…

在Meteor Lake上测试基于Stable Diffusion的AI应用

上个月刚刚推出的英特尔新一代Meteor Lake CPU,预示着AI PC的新时代到来。AI PC可以不依赖服务器直接在PC端处理AI推理工作负载,例如生成图像或转录音频。这些芯片的正式名称为Intel Core Ultra处理器,是首款配备专门用于处理人工智能任务的 …

外包干了8个月,技术退步明显...

先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

Java 的 Map 與 List

通過重新new 一個ArrayList 轉化 resTask.setList(new ArrayList<Group>(custMap.values())); 无序的Map List 有序的数据放到Map&#xff0c;就变成无序。 List排序 按照code 的字母进行排序A-Z resTask.getListData().sort(Comparator.comparing(Gmer::getCode));…

深度强化学习(王树森)笔记08

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

【论文阅读|半监督小苹果检测方法S3AD】

论文题目 &#xff1a; : Semi-supervised Small Apple Detection in Orchard Environments 项目链接&#xff1a;https://www.inf.uni-hamburg.de/en/inst/ab/cv/people/wilms/mad.html 摘要&#xff08;Abstract&#xff09; 农作物检测是自动估产或水果采摘等精准农业应用不…