博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【基础】内存泄漏与内存溢出
阅读量:6875 次
发布时间:2019-06-26

本文共 1078 字,大约阅读时间需要 3 分钟。

一、内存泄漏

内存泄漏(Memory leak):是指程序在申请内存后,无法释放已申请的内存空间。

一般我们说的内存泄漏是指堆内存的泄漏,堆内存是指程序从堆中分配的,大小任意的,使用完成之后必须显式释放内存。应用程序一般使用malloc,reloc,new等函数从堆中分配到一块内存块,使用完成后,程序必须负责相应的释放,在C中使用free(),在C++中使用free() delete  delete[] ,而java中由于垃圾回收机制不用手动释放。

如果内存不能释放,这块内存就不能再次使用,我们就说这块内存泄漏了。

二、内存溢出

内存溢出(out of memory):程序要求的内存,超出了系统所能分配的范围,如:我们使用一个int型4字节的数据来装一个float型8字节的数据,就会产生内存溢出。不过我们可以在编程时强制转换int 

三、内存泄漏分类

1、常发性内存泄漏,发生内存泄漏的代码会被多次执行到,每次被执行的之后都会导致一块内存泄漏

2、偶发性内存泄漏,发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的,对于特定的环境,偶发性的也也许就变成了常发性的,所以测试环境和测试方法对检测内存泄漏至关重要。

3、一次性内存泄漏,发生内存泄漏的代码只执行一次,或者由于算法上的缺陷,会导致总会有一块仅且一块内存发生泄漏。比如:在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。

4、隐式内存泄漏,程序在运行过程中不停的分配内存,但是知道结束的时候才释放内存,严格的说并没有发生内存泄漏,因为最终程序释放了所有申请的内存,但是对于一个服务器程序,需要运行几天、几周甚至几个月,不及时释放内存也可能导致最终耗尽吸引的所有内存,我们称这类内存泄漏为隐式内存泄漏。

四、java中存在垃圾回收机制,为什么还会有内存泄漏?

java是支持垃圾回收机制的,在这样的一个背景下,内存泄漏又被称为“无意识的对象保持”,如果一个对象引用被无意识的保留下来,那么垃圾回收器不仅不会处理这个对象,而且也不处理被这个对象引用的其他对象,“内存泄漏”就是内存中某些内存不可被回收。

eg:如果对一个栈(Stack类)先是进行入栈操作,之后再进行操作,那么弹出来的对象将不会被当做垃圾回收,即使使用栈的客户程序不再引用这些对象,因为栈内部存在着对这些已弹出对象的引用,这是类自己管理内存的机制所决定的。

转载于:https://www.cnblogs.com/dream-to-pku/p/9171492.html

你可能感兴趣的文章
ThoughtWorks雷达上的新奇变化
查看>>
Kubernetes首爆严重安全漏洞,请升级你的Kubernetes
查看>>
Linux之父为过去的言行道歉,宣布离开社区反思
查看>>
家政APP开发,需要注意什么问题?
查看>>
【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
查看>>
C语言接口与实现实例
查看>>
含有汉字的固定字符由ZHS16GBK数据库导入到AL32UTF8的数据库
查看>>
php-fpm进程数优化
查看>>
iOS中如何对具有复杂依赖的SDK在真机上进行单元测试
查看>>
Mobile Web中URL设计问题
查看>>
core Animation之CAAnimationGroup(动画群组)
查看>>
重构实践:体验interface的威力(一)
查看>>
UILabel混合显示动画效果
查看>>
Java内存泄露
查看>>
窥探Swift编程之强大的Switch
查看>>
R语言学习路线图-转帖
查看>>
【导入导出】sqlldr 导入含有内嵌换行符的数据
查看>>
Linux中常用命令
查看>>
RDS最佳实践(四)—如何处理Mysql的子查询
查看>>
最大流:Dinic模板
查看>>