内存泄漏

内存溢出和内存泄漏

你。 提交于 2019-11-30 22:16:21
内存溢出(out of memory),是指程序运行要用到的内存,系统没有足够的内存空间供其使用。 内存泄漏(memory leak),是指程序在申请内存使用后,无法释放内存空间,导致系统无法及时回收内存。 java.lang.OutOfMemoryError 产生原因有以下几种: 内存中加载的数据量过于庞大,比如一次从数据库取出过多数据。 集合类中对象的引用,使用完后未清空,使得JVM不能回收。 代码中存在死循环或循环产生过多重复对象实体。 使用的第三方软件中的BUG。 启动参数设定的过小。 解决方法: 第一步,就是修改JVM启动参数,直接增加内存。 第二步,检查错误日志,查看 Out Of Memory 错误前是否有其它异常或错误。 第三步,检查代码,找出可能发生内存溢出的位置。 第四步,使用内存查看工具动态查看内存使用情况。 常见的内存溢出报错: java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError: java heap space 内存泄漏可以分为4类: 1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。 2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。 3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次

ios Instruments 内存泄露

大城市里の小女人 提交于 2019-11-30 20:28:21
虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还是可能存在。所以了解原理很重要。 这里讲述在没有ARC的情况下,如何使用Instruments来查找程序中的内存泄露,以及 NSZombieEnabled设置的使用。 本文假设你已经比较熟悉Obj-C的内存管理机制。 实验的开发环境:XCode 4.5.2 1、运行Demo。 先下载一个实现准备好的内存泄露的Demo吧: leak app 下载下来,打开运行,程序是一个寿司的列表,列出各种寿司卷。试着选择里面的几行,应该是选第二行的时候就崩溃了。崩溃截图: 在崩溃的地方断住了,知道crash的地方了,但是不知道具体crash的原因。 2、设置NSZombieEnabled 这是一个 “EXC_BAD_ACCESS”错误。我们打开XCode的选项:“NSZombieEnabled” 。在crash时可能会给你更多的一些提示信息。 设置步骤:1 2:勾上红色框里的 运行,按刚才的操作选中其中的cell。再次crash,这次在output窗口会看到多了一项错误信息: 2012-11-28 13:22:08.911 PropMemFun[2132:11303] *** -[CFString respondsToSelector:]: message sent to deallocated instance

Deleaker – 内存泄漏猎人(RAD Studio 的附加组件)

陌路散爱 提交于 2019-11-30 14:40:57
程序员面临(并希望我们意识到)的常见问题之一是内存泄漏或任何其他类型的资源泄漏。 例如,Windows限制了进程一次可以分配的GDI或USER32对象的数量。 当事情走错路时,您可能希望拥有一些工具来帮助您(再次)找到自由创建自己的正确路径。 一些IDE具有内置的泄漏检测功能。 MS的Visual Studio最近获得了一个工具,可以显示从堆分配的内存块的列表。 遗憾地说,但不仅从堆分配可能会泄漏内存,而且还通过COM / ActiveX技术分配的内存和虚拟内存和文件映射视图,等等。 不幸的是,Visual Studio根本无法检测到句柄,GDI和USER32资源的泄漏(另一方面,Deleaker可以检测到所有类型的泄漏,并且也可以在Visual Studio中工作)。 RAD Studio没有这样的内置工具。 如果在调试期间可以仅单击“魔术”按钮,并查看在何处以及通过什么代码分配了内存,文件和其他描述符,对象,那就太好了。 Deleaker 最近这样的延伸, Deleaker ,它可以做所有这一切以及更多, 已被释放 。 最初,Deleaker是作为Visual Studio的扩展而创建的,但从今年开始,它开始支持其他IDE,包括RAD Studio和Qt Creator。 您可以在此处下载Deleaker: https : //www.deleaker.com/download

线上应用故障排查之二:高内存占用

孤街醉人 提交于 2019-11-30 01:16:36
上一篇介绍了 线上应用故障排查之一:高CPU占用 ,这篇主要分析高内存占用故障的排查。 搞Java开发的,经常会碰到下面两种异常: 1、java.lang.OutOfMemoryError: PermGen space 2、java.lang.OutOfMemoryError: Java heap space 要详细解释这两种异常,需要简单重提下Java内存模型。 Java内存模型 是描述Java程序中各变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存取出变量这样的低层细节。 在Java虚拟机中,内存分为三个代:新生代( New )、老生代( Old )、永久代( Perm )。 (1)新生代New:新建的对象都存放这里 (2)老生代Old:存放从新生代New中迁移过来的生命周期较久的对象。新生代New和老生代Old共同组成了堆内存。 (3)永久代Perm:是非堆内存的组成部分。主要存放加载的Class类级对象如class本身,method,field等等。 如果出现java.lang.OutOfMemoryError: Java heap space异常,说明Java虚拟机的堆内存不够。原因有二: (1)Java虚拟机的堆内存设置不够,可以通过参数-Xms、-Xmx来调整。 (2)代码中创建了大量大对象,并且长时间不能被垃圾收集器收集

内存泄露:a CDynLinkLibrary object at...的解决

纵然是瞬间 提交于 2019-11-29 16:33:57
这两天在设计一个项目,独立了几个 DLL 模块。昨天勉强把前段工作做完了,需要的 DLL 也都挂进了 EXE 文件之中,暗自高兴了一把。不过晚上在看的时候,发现 VS2005 输出窗口提示有内存泄露: a CDynLinkLibrary object at... 心里总觉得不爽 L 今天去 Google 搜索了一下,第一篇是:当您使用多个 MFCDLL 报告内存泄漏 http://support.microsoft.com/kb/167929/zh-cn 由于是“ 注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。”所以没有怎么仔细看。 后来通过注释代码发现,原因可能是因为一个 DLL 内部使用另一个 DLL 中的导出类造成的。于是将这两个 DLL 合并到一个 DLL 中,再链接到 EXE 中测试,果然没了 J 但是我又不想将这两个 DLL 合并到一起,因为另一个 DLL 是“通用”的。我在想,这倒底是什么原因呢?一生气,算了,直接搞个 Win32 DLL ,也不使用什么 MFC DLL 。 建立好 Win32 DLL 之后,拷贝以前 DLL 中的类到项目,加进去编译。编译器却提示说:什么 MFC 工程需要 MFC DLL 支持。再一想,原来是因为以前的 MFC DLL 向导会默认包含 stdafx.h 。纯 Win32 DLL 不需要这个。突然之间,又想到了一个问题

线上应用故障排查之二:高内存占用

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-29 00:31:33
搞Java开发的,经常会碰到下面两种异常: 1、java.lang.OutOfMemoryError: PermGen space 2、java.lang.OutOfMemoryError: Java heap space 要详细解释这两种异常,需要简单重提下Java内存模型。 Java内存模型 是描述Java程序中各变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存取出变量这样的低层细节。 在Java虚拟机中,内存分为三个代:新生代( New )、老生代( Old )、永久代( Perm )。 (1)新生代New:新建的对象都存放这里 (2)老生代Old:存放从新生代New中迁移过来的生命周期较久的对象。新生代New和老生代Old共同组成了堆内存。 (3)永久代Perm:是非堆内存的组成部分。主要存放加载的Class类级对象如class本身,method,field等等。 如果出现java.lang.OutOfMemoryError: Java heap space异常,说明Java虚拟机的堆内存不够。原因有二: (1)Java虚拟机的堆内存设置不够,可以通过参数-Xms、-Xmx来调整。 (2)代码中创建了大量大对象,并且长时间不能被垃圾收集器收集(存在被引用)。 如果出现java.lang.OutOfMemoryError:

性能测试:压力测试、负载测试、并发测试、强度测试及容量测试之间的区别

一曲冷凌霜 提交于 2019-11-28 23:29:13
性能测试又称多用户并发性能测试。 1、压力测试:压力测试的目标是测试在一定的负载下系统长时间运行的稳定性,尤其关注大业务量情况下长时间运行系统性能的变化(例如是否反应变慢、是否会内存泄漏导致系统逐渐崩溃、是否能恢复);压力测试是测试系统的限制和故障恢复能力,它包括两种情况: a.稳定性压力测试:在选定的压力值下,长时间持续运行。通过这类压力测试,可以考察各项性能指标是否在指定范围内,有无内存泄漏、有无功能性故障等; b.破坏性压力测试:在稳定性压力测试中可能会出现一些问题,如系统性能明显降低,但很难暴露出其真实的原因。通过破坏性不断加压的手段,往往能快速造成系统的崩溃或让问题明显的暴露出来; 2、负载测试的目标是测试在一定负载情况下系统性能(不关注稳定性,也就是说不关注长时间运行,只是得到不同负载下相关性能指标即可);实际中我们常从比较小的负载开始,逐渐增加模拟用户的数量(增加负载), 观察不同负载下应用程序响应时间、所耗资源,直到超时或关键资源耗尽,这就是所说的负载测试,它是测试系统的不同负载情况下的性能指标。 3、并发测试:主要指当测试多用户并发访问同一个应用、模块、数据时是否产生隐藏的并发问题,如内存泄漏、线程锁、资源争用问题,几乎所有的性能测试都会涉及并发测试。 4、强度测试:强度测试检查程序对异常情况的抵抗能力

fir.im Weekly

☆樱花仙子☆ 提交于 2019-11-28 22:32:35
从 iOS 7 翻天覆地的全新设计,iOS 8 中 Size Classes 的出现,应用扩展,以及 Cloud Kit 的加入,iOS 9 的分屏多任务特性,今年的 WWDC iOS 10 SDK 又有哪些新的特性呢? 来看看喵神 @onevcat 的这篇关于 开发者所需要知道的 iOS 10 SDK 新特性 ,也许你会有所收获。后续喵神会补充关于 WDDC session 的学习笔记,多多留意他的 博客 。 我们还找到了其他关于 WWDC 的干货,比如 百度技术团队的 WWDC 2016 观影指南 ,整理了 WWDC 值得看的Session;还有 @唐巧_boy 大神的 WWDC 2016 随想 ,对于开发者,值得一看。 再来看下本期 fir.im 的其他内容 ~ 『 iOS,Android 开发干货分享』 Objective-C 消息发送与转发机制原理 作者 @杨萧玉HIT 在这篇文章中讲述了开发者在消息发送和转发流程中的原理。看这篇文章前,也许你应该对 Objective-C Runtime 已经有一定的了解,关于 Class 的结构,selector、IMP、元类等概念将不再赘述。 全文浏览,点击 这里 。 JakeLin/IBAnimatable 来自 @林永坚Jake 的分享。 “ 进过多天的奋战,我们发布 IBAnimatable 2.3 了

shared_ptr的原理与应用

两盒软妹~` 提交于 2019-11-28 20:28:01
new与赋值的坑 赋值(assignment)和new运算符在C++与Java(或C#)中的行为有本质的区别。在Java中,new是对象的构造,而赋值运算是引用的传递;而在C++中,赋值运算符意味着"构造",或者"值的拷贝",new运算符意味着在堆上分配内存空间,并将这块内存的管理权(责任)交给用户。C++中的不少坑,就是由new和赋值引起的。 在C++中使用new的原因除了堆上能定义体积更大的数据结构之外,就是能使用C++中的dynamic dispatch(也叫多态)了:只有指针(和引用)才能使用虚函数来展现多态性。在这时,new出来的指针变得很像Java中的普通对象,赋值意味着引用的传递,方法调用会呈现出多态性,我们进入了面向对象的世界,一切十分美好,除了"要手动释放内存"。 在简单的程序中,我们不大可能忘记释放new出来的内存,随着程序规模的增大,我们忘了delete的概率也随之增大,这是因为C++是如此一个精神分裂的语言,赋值运算符竟然同时展现出"值拷贝"和"引用传递"两种截然不同的语义,这种不一致性导致"内存泄漏"成为C++新手最常犯的错误之一。当然你可以说,只要细心一点,一定能把所有内存泄漏从代码中清除。但手动管理内存更严重的问题在于,内存究竟要由谁来分配和释放呢?指针的赋值将同一对象的引用散播到程序每个角落,但是该对象的删除却只能发生一次

后端开发面试准备-字节跳动-C++

只愿长相守 提交于 2019-11-28 15:56:02
文章目录 C++ 内存泄漏 野指针 悬挂指针 memcpy-内存重叠 C中函数指针作用 隐式类型转换 及其问题 什么是隐式转换? 为什么要进行隐式转换? 隐式转换原则 隐式转换发生条件 C++ 内存泄漏 用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。即所谓内存泄漏。 注意:内存泄漏是指堆内存的泄漏。 简单的说就是申请了一块内存空间,使用完毕后没有释放掉。 它的一般表现方式是程序运行时间越长,占用内存越多,最终用尽全部内存,整个系统崩溃。//所以这是windows长时间不关机不好的原因之一? 由程序申请的一块内存,且没有任何一个指针指向它,那么这块内存就泄露了。 野指针 “野指针”不是NULL指针,是指向“垃圾”内存的指针。野地。 野指针的成因主要有两种: 指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化, 要么将指针设置为NULL,要么让它指向合法的内存 。 指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾