1. 什么是内存泄露?
内存泄露: 对象不再被使用,但是又有引用指向它,所以不能被GC回收。
为了更清楚的理解这个定义,我们需要知道对象在内存中的状态。下面这个插图将对象分为两种状态,被引用的和未被引用的。其中被引用的对象中有一部分是没被使用的。内存泄露就发生在这些对象所在的内存区域。
2. 为什么会发生内存泄露?
让我们来看接下来这个例子,它会告诉我们为什么会发生内存泄露。在这个例子中,对象A指向对象B。对象A的生命周期是(t1-t4)比对象B的生命周期(t2-t3)长很多。当对象B不再被程序所使用的时候,对象A依然指向它。这样的话GC就不能从内存中回收对象B。这样的话就可能会引起内存溢出。因为如果对象A指向很多个这样的对象,内存中就会存在很多不能被回收内存空间的对象。
还有另外一种情况,B指向了其它的很多对象,导致了其它的对象也不能被回收。
3.怎样预防内存泄露?
以下有几点预防内存泄露的小建议:
-
留心使用集合类,如:HashMap,ArrayList,因为内存泄露通常是它们引起的。当它们被声明为
static
,它们的生命周期就跟应用的生命周期相同。 -
留心使用事件监听和回调函数。如果监听被注册了之后但是该类不再被使用的时候没有注销也会引起内存泄露。
-
成员变量如果是对象的话,需要使用null来销毁这个对象的引用。
4. 为什么JDK6中的substring()方法会导致内存泄露?
JDK6中subString()的源码
01 |
//JDK 6 |
02 |
String( int offset, int count, char value[]) {
|
03 |
this .value = value;
|
04 |
this .offset = offset;
|
05 |
this .count = count;
|
06 |
} |
07 |
public String substring( int beginIndex, int endIndex) {
|
08 |
//check boundary
|
09 |
return new String(offset + beginIndex, endIndex - beginIndex, value);
|
10 |
} |
实际上substring并没有去new 一个String对象,substring返回的字符串和之前的字符串是共用的一个字符数组。
只是数组的起点和长度改变了。所以之前的那个被截取的字符串就没有(也不能)被回收。
如果你想要让它能被回收,可以这样substring.
1 |
x.substring(a,b)+ ""
|
2 |
//or |
3 |
new String(x.substring(a,b))
|
前者等同于:
1 |
StringBuilder sb = new StringBuilder();
|
2 |
sb.append(x.substring(x, y)); |
3 |
sb.append( "" );
|
4 |
x = sb.toString(); |
所以,使用new String(x.substring(a,b))的方式效率更高。
原文:http://www.programcreek.com/2013/10/the-introduction-of-memory-leak-what-why-and-how/
相关推荐
讲解关于android内存泄露的各种情况
JAVA 作为常用语言也存在java 内存泄露简介,可以帮助我们进一步理解常见的问题。
Quest jprobe Suite 功能简介及内存泄露检测,帮会租解决Java应用的效率和稳定。
C++内存泄露的常用检测工具 Visual C++ 提供的库函数 Compuware DevPartner Studio IBM Rational PurifyPlus
Android内存泄漏简介 不少人认为java程序,因为有垃圾回收机制,应该没有内存泄漏 1.引用没有释放造成的内存泄漏 2.资源对象没有关闭造成的内存泄漏 3.一些不良代码造成的内存压力 4.JNI代码的内存泄漏
JVisualVM简介与内存泄漏实战分析,如何分析内存溢出,定位内存溢出问题
## 简介 Visual C++ 提供了内建的内存泄漏检测功能,但是它的功能非常有限。这个内存泄漏检测器是作为 Visual C++ 内建内存泄漏检测器的一个免费替代品而被创建的。以下是 Visual Leak Detector 的一些特点,这些...
简介内存泄露是每个开发者最终都要面对的问题,它是许多问题的根源:反应迟缓,崩溃,高延迟,以及其他应用问题。什么是内存泄露?本质上,内存泄露可以定义为:应用程序不
内存管理简介 内存管理的职责为分配内存,回收内存。 没有自动内存管理的语言/...另一个典型问题为内存泄露,内存已经分配,但是已经没有了指向该内存的指针,导致内存泄露。 程序员要花费大量时间在调试该类问题上
(1)内存泄露报表,自动检查可能存在内存泄露的对象,通过报表展示存活的对象以及为什么他们没有被垃圾收集; (2)对象报表,对可颖对象的分析,如字符串是否定义重了,空的collection、finalizer以及弱引用等。 ...
最近博主开始在项目中实践MVP模式,却意外发现内存泄漏比较严重,但却很少人谈到这个问题,促使了本文的发布,本文假设读者已了解MVP架构。 MVP简介 M-Modle,数据,逻辑操作层,数据获取,数据持久化保存。比如...
简介:虽然用 Java:trade_mark: 语言编写的程序在理论上是不会出现“内存泄漏”的,但是有时对象在不再作为程序的逻辑状态的一部分之后仍然不被垃圾收集。本月,负责保障应用程序健康的工程师 Brian Goetz 探讨了无...
C11并未引入全自动的垃圾回收机制,但智能指针提供了一种类似垃圾回收的资源管理方式,通过自动释放不再使用的资源来减少内存泄露和悬挂指针问题。C11的智能指针支持自定义删除器,允许开发者在智能指针释放资源时...
功能简介:使用遗传算法设计并实现了...缺点:代码虽然经过了一定优化,但还是有一部分地方没有优化,比如有些地方仍然有内存泄露的危险,如果您有兴趣,也可以尝试优化。 语言:VC++ MFC 环境:VS2005、SQL SERVER2005
7.内存及cpu占用小,无内存泄露,连续工作n天不崩溃。 8.视频清晰流畅,延迟500ms左右,带宽占用仅1M左右,互联网体验好。 9.跨平台播放器有exe、apk,也可以用极速浏览器以werbrtc或httpflv访问。 10.播放器地址可...
修订历史记录 目录 第一章 Jtest简介 4 一. 特性 4 二. 好处 5 三. 支持平台 5 四. 支持的集成平台 5 五. 推荐硬件要求 6 ...一....二....一....二....三....四....五....六....七....八. 内存泄露检查 45 第四章 RuleWizard定制规则 48
结合自己多个应用开发实践的案例,与大家分享iOS开发的技术实践,内容将涉及:开源框架的选择,如何搭建程序架构从而写更干净的代码,如何有效使用内存和防止内存泄露,如何巧妙运用快捷键,快速加载图片的实践过程...
8.内存及cpu占用小,无内存泄露,连续工作n天不崩溃。 9.视频清晰流畅,延迟500ms左右,带宽占用仅1M左右,互联网体验好。 10.跨平台播放器有exe、apk,也可以用极速浏览器以werbrtc或httpflv访问。 使用说明: 1.该...
本文主要介绍Android上可以进行音频(PCM)播放的两个组件–AudioTrack/OpenSL ES的简单使用方法。 对一个音频文件(如MP3文件),如何使用FFmpeg进行解码获取到PCM,之前的文章已经有相应的说明: ...
使用说明: 1.该工具主要用于二次开发...8.内存及cpu占用小,无内存泄露,连续工作n天不崩溃。 9.视频清晰流畅,延迟500ms左右,带宽占用仅1M左右,互联网体验好。 10.跨平台播放器有exe、apk,也可以用极速浏览器以we