内存溢出和内存泄漏的定义,产生原因以及解决方法(面试经验总结)
一、定义(概念与区别)
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请 了一个integer,但给它存了long才能存下的数,那就是内存溢出。
内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但 内存泄露堆积后果很严重,无论多少内存,迟早会被占光。 memory leak会最终会导致out of memory! 内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。
二、内存泄露
内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内 存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。一个 盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出!比方说栈,栈满时 再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。就是分配的内存不足 以放下数据项序列,称为内存溢出.
以发生的方式来分类,内存泄漏可以分为4类:
1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。
2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对 于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。
3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发 生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。
4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内 存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。 从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。 真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危 害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到
三、内存溢出
内存溢出的原因以及解决方法 引起内存溢出的原因有很多种,小编列举一下常见的有以下几种:
1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
3.代码中存在死循环或循环产生过多重复的对象实体;
4.使用的第三方软件中的BUG;
5.启动参数内存值设定的过小
内存溢出的解决方案: 第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。
第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。
重点排查以下几点:
1.检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内 存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
2.检查代码中是否有死循环或递归调用。
3.检查是否有大循环重复产生新对象实体。
4.检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内 存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查 询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。 5.检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使 得这些对象不能被GC回收。 第四步,使用内存查看工具动态查看内存使用情况
引用:https://blog.csdn.net/ShanYu1198124123/article/details/52414392?utm_source=copy
相关文章:

【Codeforces】716B Complete the Word (26个字母)
http://codeforces.com/contest/716/problem/B 给你一个字符串该字符串中是否存在长度为26且这26个字母没有重复 一个满足上述条件但是部分区域是问号的话,需要用剩下的字母覆盖掉问号,其余部分的问号可以随便赋值 没有的话输出-1 暴力即可。 #incl…

MySQL ERROR 1878 解决办法
MySQL ERROR 1878报错解决办法错误重现Part1:大表修改字段mysql> ALTER TABLE erp-> ADD COLUMN eas_status tinyint(3) unsigned NOT NULL DEFAULT 0 AFTER totalprice;ERROR 1878 (HY000): Temporary file write failure.mysql> \q这里可以看到,添加字…

共享程序集和强命名程序集(3):强命名程序集的一些作用
强命名程序集能防篡改 用私钥对程序集进行签名,并将公钥和签名嵌入程序集,CLR就可以炎症程序集未被修改或破坏。程序集安装到GAC时,系统对包含清单的那个文件的内容进行哈希处理,将Hash值与PE文件中嵌入的RSA数字签名进行比较。如…
堆和栈的区别(面试经验总结)
C中,内存分为5个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区。通常存放局部变量、函数参数等。 堆:是由new分配的内存块,由程序员…

百度Q3财报里的“大生意”
在今日发布的Q3财报中,百度花了不少篇幅来介绍人工智能业务的进展,作为百度的技术核心,近段时间几乎所有百度业务都在与人工智能做深入结合,这预示着移动互联网信息化技术发展已经全面开启人工智能时代,而百度势必要在…

【Codeforces/HDU】76A Plus and xor / 2095 find your present (2)(异或)。
http://codeforces.com/contest/76/problem/D A X Y B X xor Y 异或(不进位加法):两个二进制数,对应的位置上,相同为0,不同为1 性质:a^a0,a^0a,满足交换律 所以…

前端项目如何管理
前端项目如何管理 前端项目的管理分为两个维度:项目内的管理与多项目之间的管理。 1. 项目内的管理 在一个项目内,当有多个开发者一起协作开发时,或者功能越来越多、项目越来越庞大时,保证项目井然有序的进行是相当重要的。 一般会…
CMake学习(一)
什么是 CMake 你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行…

【Codeforces】1104C Grid game (变异的俄罗斯方块)
http://codeforces.com/problemset/problem/1104/C 4 X 4 的方格 放置 1*2的矩形(用1表示)和2*1的矩形(用0表示) 只要有一行或者一列都填满了,就会自动消除,就可以放心的矩形了,只要不重叠就可…

如何创建.gitignore文件,忽略git不必要提交的文件
1、在需要创建 .gitignore 文件的文件夹, 右键选择Git Bash 进入命令行,进入项目所在目录。 2、输入 touch .gitignore ,生成“.gitignore”文件。 3、在”.gitignore” 文件里输入你要忽略的文件夹及其文件就可以了。(注意格式) …

软件安全访谈:ZipSlip、NodeJS安全性和BBS攻击
正如Nodejs Security WG成员和Snyk开发者布道师Liran Tal所写的那样,自BBS早期以来,这种漏洞利用的矢量攻击已经为人所知。InfoQ采访了Tal,了解了更多有关软件安全性(尤其是Nodejs安全性)的相关信息。今年早些时候&…

客户端与服务器的数据交互
毕设需要接粗到一些关于app和前端后端的东西,学习记录一下。 首先不要管安卓端还是苹果端,现在一般都是响应式的app,放到安卓或者苹果或者pc或者平板都是没有问题的。一般采用的是http接口通讯,或者socket连接。具体你要去查资料…

【Codeforces】908B New Year and Buggy Bot(暴力+全排列)
http://codeforces.com/contest/908/problem/B 0 1 2 3 可以对应 上下左右。(具体哪个对应哪个,试过才知道) str 的 长度 为 100,0 1 2 3 的全排列一共24种,最坏的情况可以看成遍历长为2400的字符串,不会…

swoole实现数据库连接池
2019独角兽企业重金招聘Python工程师标准>>> 原生 PHP CURD 让我们来回顾一下PHP中数据库的使用 <?php # curd.php$id 1;$dbh new PDO(); $stmt $dbh->prepare(SELECT * FROM user WHERE id:id); $stmt ->bindValue(:id, $id); $user $stmt->f…

bats-Bash自动化测试工具
本文分析了bats--Bash自动化测试工具的安装、语法、常用指令及常用函数等内容。上篇文章回顾:学习RAID 01/10/10E的区别bats 是一个符合 TAP 标准 的 Bash 版测试框架,它使用了一种极为简便的方法来验证命令行程序是否正常运行。bats 要求 Bash 的最低版…
ORB + OPENCV
一、介绍 假如有两张人物图片,我们的目标是要确认这两张图片中的人物是否是同一个人。如果人来判断,这太简单了。但是让计算机来完成这个功能就困难重重。一种可行的方法是: 分别找出两张图片中的特征点描述这些特征点的属性,比较…

【Codeforces】967C Stairs and Elevators (二分)。
http://codeforces.com/contest/967/problem/C 从一个地方到另一个地方,可以选择爬楼梯或者坐电梯 ,前提是楼梯或者电梯存在。 n 楼层数 m 每一层的房间数 s 楼梯的数量 e 电梯的数量 v 电梯的速度 第2行是s个楼梯的位置 第3行是e个电梯的位置 …

webpack 最简打包结果分析
原文链接:https://ssshooter.com/2019-02... 现在的 webpack 不再是入门噩梦,过去 webpack 最让人心塞的莫过于配置文件,而 webpack4 诞生随之而来的是无配置 webpack。 使用 webpack4,至少只需要安装 webpack 和 webpack cli。所以大家完全可…

orb-slam2(学习笔记)+相机
单目(Monocular)、双目(Stereo)、深度相机(RGB-D) 深度相机能够读取每个像素离相机的距离 ,单目相机 只使用一个摄像头进行SLAM的做法叫做单目SLAM(Monocular SLAM),结构…

如何在nuget上传自己的包+搭建自己公司的NuGet服务器(新方法)
运维相关:http://www.cnblogs.com/dunitian/p/4822808.html#iis 先注册一个nuget账号https://www.nuget.org/ 下载并安装一下NuGetPackageExplorer:https://github.com/NuGetPackageExplorer/NuGetPackageExplorer 创建一个包(vs其实也是可以…

【Codeforces】1080C Masha and two friends (棋盘染色)
http://codeforces.com/problemset/problem/1080/C 给定一个棋盘,(1,1)的位置是白色,观察可以知道,如果横纵坐标之和是偶数,那么是白色,奇数的话就是黑色。 只要算出染色以后白色方…
Java多线程001——一图读懂线程与进程
本博客 猫叔的博客,转载请申明出处前言 本系列将由浅入深,学习Java并发多线程。 一图读懂线程与进程 1、一个进程可以包含一个或多个线程。(其实你经常听到“多线程”,没有听过“多进程”嘛)2、进程存在堆和方法区 3、…

TermCriteria模板类
学习写vo过程中遇到的 类功能:模板类,作为迭代算法的终止条件。 构造函数: TermCriteria(int type,int maxCount,double epsilon); 参数说明: type 迭代终止条件类型 typeTermCriteria::MAX_ITER/TermCrite…

SQL优化快速入门
最近遇到一个专门进行SQL技术优化的项目,对很多既有的老存储过程进行调优(现在已经不再新增任何存储过程),因此系统的对SQL语句编写进行一次科学的学习变得很有必要。这儿将基于黄德承大神的Oracle SQL语句优化一书,选…
【HDU】4509 湫湫系列故事——减肥记II (区间覆盖 暴力)
http://acm.hdu.edu.cn/showproblem.php?pid4509 给出的时间段是被占用的时间,24h 1440 min,求出这些区间以外的区间长度 把00:00 - 23:59 变成0-1440 1-5都是被占用的区域,暴力很好理解 #include <iostream>…

Java并发编程71道面试题及答案
Java并发编程71道面试题及答案 1、在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User)。 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDa…

USB获取图像实时处理
手写VO的准备工作,调用UAB或者本地相机获取视频图像,读取并保存视频。 #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include "openc…

常见数据库 性能
2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/u/582827/blog/778908

【Codeforces】1093C Mishka and the Last Exam
http://codeforces.com/problemset/problem/1093/C 已知b[i]求a[i]和a[n-i1],n是a数组中元素的个数,a数组的下标从1开始 输出b[1]的时候,直接让a[1] 0,a[n] b[0] 接下来的每一组,先让a[i] b[i],然后求…
PHP面试常考内容之Memcache和Redis(2)
你好,是我琉忆。继周一(2019.2-18)发布的“PHP面试常考内容之Memcache和Redis(1)”后,这是第二篇,感谢你的支持和阅读。本周(2019.2-18至2-22)的文章内容点为以下几点&am…