【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等断言库,确保内存的正确使用。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React18-模拟列表数据实现基础表格功能

文章目录 分页功能分页组件有两种接口参数分页类型用户列表参数类型 模拟列表数据分页触发方式实现目录 分页功能 分页组件有两种 table组件自带分页 <TableborderedrowKey"userId"rowSelection{{ type: checkbox }}pagination{{position: [bottomRight],pageSi…

海外云手机对于亚马逊卖家的作用

近年来&#xff0c;海外云手机作为一种新型模式迅速崭露头角&#xff0c;成为专业的出海SaaS平台软件。海外云手机在云端运行和存储数据&#xff0c;通过网页端操作&#xff0c;将手机芯片放置在机房&#xff0c;通过网络连接到服务器&#xff0c;为用户提供便捷的上网功能。因…

Spring Boot 中文件上传

Spring Boot 中文件上传 一、MultipartFile二、单文件上传案例三、多文件上传案例四、Servlet 规范五、Servlet 规范实现文件上传 上传文件大家用的最多的就是 Apache Commons FileUpload&#xff0c;这个库使用非常广泛。Spring Boot3 版本中已经不能使用了。代替它的是 Sprin…

苍穹外卖项目可以写的简历和如何优化简历

文章目录 重点写中规写添加自己个性的项目面试会问道的问题 我是一名双非大二计算机本科生&#xff0c;希望我的分享对你有帮助&#xff0c;点赞关注不迷路。 简历编写一直是很多人求职人的心病&#xff0c;我自己上学期有一门课程是去校内企业面试&#xff0c;当时我就感受出…

MySQL库表操作 作业

题目&#xff1a; 1. sql语句分为几类?2. 表的约束有哪些,分别是什么,设置的语法分别是什么?3. 做出班级表,学生表的E-R图,数据库模型图,以及核心的sql语句. 1. MySQL致力于支持全套ANSI/ISO SQL标准。在MySQL数据库中&#xff0c;SQL语句主要可以划分为以下几类: > DD…

【三维重建】三角化

三角化要解决的问题是&#xff1a; 已知两个相机的内参K、K、相机之间的旋转平移矩阵R、t以及匹配点p、p&#xff0c;如何求得P点的三维坐标&#xff1f; 线性解法

彻底解决 MAC Android Studio gradle async 时出现 “connect timed out“ 问题

最近在编译一个比较老的项目&#xff0c;git clone 之后使用 async 之后出现一下现象&#xff1a; 首先确定是我网络本身是没有问题的&#xff0c;尝试几次重新 async 之后还是出现问题&#xff0c;网上找了一些方法解决了本问题&#xff0c;以此来记录一下问题是如何解决的。 …

【Tomcat与网络5】再论Tomcat的工作过程与两种经典的设计模式

前面两篇&#xff0c;我们重点分析了Tomcat的容器和连接器的基本设计&#xff0c;今天我们来看一下两个机构如何在service的调度下进行协同工作的。 目录 1.模板模式与Tomcat的重用性设计 2.观察者模式与Tomcat可扩展性设计 1.模板模式与Tomcat的重用性设计 首先&#xff0…

油分离器的介绍

压缩机的排气中带有冷冻机油&#xff0c;这些冷冻机油如果随制冷剂蒸汽进入冷凝器、蒸发器后将 在传热表面形成油膜&#xff0c;从而影响换热效果。因此通常在压缩机与冷凝器之间装设油分离器&#xff0c;用 来分离制冷剂蒸汽中挟带的冷冻机油。在氟利昂制冷系统中&#xff0c;…

读AI3.0笔记10_读后总结与感想兼导读

1. 基本信息 AI 3.0 (美)梅拉妮米歇尔 著 四川科学技术出版社,2021年2月出版 1.1. 读薄率 书籍总字数355千字&#xff0c;笔记总字数33830字。 读薄率33830355000≈9.53% 1.2. 读厚方向 千脑智能 脑机穿越 未来呼啸而来 虚拟人 新机器人 如何创造可信的AI 新机器智…

sklearn 计算 tfidf 得到每个词分数

from sklearn.feature_extraction.text import TfidfVectorizer# 语料库 可以换为其它同样形式的单词 corpus [list(range(-5, 5)),list(range(-6,4)),list(range(12)),list(range(13))]# corpus [ # [Two, wrongs, don\t, make, a, right, .], # [The, pen, is, might…

CGAL5.4.1 边塌陷算法

目录 1、使用曲面网格的示例 2、使用默认多面体的示例 3、使用丰富多面体的示例 主要对1、使用曲面网格的示例 进行深度研究 CGAL编译与安装CGAL安装到验证到深入_cgal测试代码-CSDN博客 参考资料CGAL 5.4.5 - Triangulated Surface Mesh Simplification: User Manual …

云原生 k8s 可能使用到的端口整理【不定期更新】

k8s 因为涉及到的组件太多了&#xff0c;所以端口有很多&#xff0c;这里整理了日常所接触的接口&#xff0c;后续有新的再更新。 如果是通过公网 IP 进行安装的时候需要根据实际情况有选择的进行放开&#xff1b;一般只有云厂商会提供公网 IP 访问&#xff0c;自建的话不建议 …

通过WSL2来实现Windows10/11的深度学习模型GPU加速,TensorFlow项,Jupyter及其插件安装,CQF心得,金融量化

通过WSL2来实现TF的GPU加速 为什么要用WSL&#xff08;Windows Subsystem Linux&#xff09;安装WSL2&#xff0c;miniconda&#xff0c;cuda&#xff0c;cudnn&#xff0c;TA-Lib安装 WSL2安装 Miniconda3安装 CUDA安装 cuDNN安装 TensorFlow 库安装 TA-Lib 库安装其它CQF及金…

Inventor 2024下载安装教程,免费使用,附安装包和工具,流程简单,小白也能轻松搞定

前言 Inventor是一款专业的三维可视化实体建模软件&#xff0c;Inventor.主要用于各类二维机械制图、三维制图的设计和开发等操作&#xff0c;可以广泛地应用于零件设计、钣金设计、装配设计等领域。 准备工作 1、Win7及以上系统 2、提前准备好 Inventor 2024 安装包 没有…

【操作系统】知识补漏

进程之间的关系&#xff1a; 1.独立 2.交互关系 2.1 竞争关系----互斥锁【解决】 2.2 协作关系----信号量【解决】 Linux调度策略的过程 linux 分为两个模型&#xff1a; 1 Normal 模式 sched_other[RR] 2. real-time 模式 real -time模式的进程优先级永远高于Normal模型 查…

2401Idea用GradleKotlin编译Java控制台中文出乱码解决

解决方法 解决方法1 在项目 build.gradle.kts 文件中加入 tasks.withType<JavaCompile> {options.encoding "UTF-8" } tasks.withType<JavaExec> {systemProperty("file.encoding", "utf-8") }经测试, 只加 tasks.withType<…

正则表达式(RE)

什么是正则表达式 正则表达式&#xff0c;又称规则表达式&#xff08;Regular Expression&#xff09;。正则表达式通常被用来检索、替换那些符合某个规则的文本 正则表达式的作用 验证数据的有效性替换文本内容从字符串中提取子字符串 匹配单个字符 字符功能.匹配任意1个…

0130-2-秋招面试—HTML篇

2023 HTML面试题 1.src和href的区别 scr用于替换当前元素&#xff0c;href用于在当前文档和外部资源之间建立联系。 <script src"main.js"></script><link href"style.css" rel"stylesheet" />2.对HTML语义化的理解 根据内…

数列极限一基础篇-重点习题记录

海涅定理与函数连续 首先证明函数在X0处连续&#xff1a; X 利用归结原则&#xff08;海涅定理&#xff09;证明函数 在x&#xff01;0处不连续&#xff1a; 收获&#xff1a; 数列极限单调有界应用 题1 题2 题3