博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[翻译]内存泄露简介
阅读量:6042 次
发布时间:2019-06-20

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

  hot3.png

1. 什么是内存泄露?

内存泄露: 对象不再被使用,但是又有引用指向它,所以不能被GC回收。

为了更清楚的理解这个定义,我们需要知道对象在内存中的状态。下面这个插图将对象分为两种状态,被引用的和未被引用的。其中被引用的对象中有一部分是没被使用的。内存泄露就发生在这些对象所在的内存区域。

where-is-memory-leak

2. 为什么会发生内存泄露?

让我们来看接下来这个例子,它会告诉我们为什么会发生内存泄露。在这个例子中,对象A指向对象B。对象A的生命周期是(t1-t4)比对象B的生命周期(t2-t3)长很多。当对象B不再被程序所使用的时候,对象A依然指向它。这样的话GC就不能从内存中回收对象B。这样的话就可能会引起内存溢出。因为如果对象A指向很多个这样的对象,内存中就会存在很多不能被回收内存空间的对象。

还有另外一种情况,B指向了其它的很多对象,导致了其它的对象也不能被回收。

object-life-time

3.怎样预防内存泄露?

以下有几点预防内存泄露的小建议:

  1. 留心使用集合类,如:HashMap,ArrayList,因为内存泄露通常是它们引起的。当它们被声明为 static,它们的生命周期就跟应用的生命周期相同。

  2. 留心使用事件监听和回调函数。如果监听被注册了之后但是该类不再被使用的时候没有注销也会引起内存泄露。

  3. 成员变量如果是对象的话,需要使用null来销毁这个对象的引用。

4. 为什么JDK6中的substring()方法会导致内存泄露?

JDK6中subString()的源码

//JDK 6String(int offset, int count, char value[]) {    this.value = value;    this.offset = offset;    this.count = count;} public String substring(int beginIndex, int endIndex) {    //check boundary    return  new String(offset + beginIndex, endIndex - beginIndex, value);}

实际上substring并没有去new 一个String对象,substring返回的字符串和之前的字符串是共用的一个字符数组。

只是数组的起点和长度改变了。所以之前的那个被截取的字符串就没有(也不能)被回收。

如果你想要让它能被回收,可以这样substring.

x.substring(a,b)+""//ornew String(x.substring(a,b))

前者等同于:

StringBuilder sb = new StringBuilder();sb.append(x.substring(x, y));sb.append("");x = sb.toString();

所以,使用new String(x.substring(a,b))的方式效率更高。

原文:http://www.programcreek.com/2013/10/the-introduction-of-memory-leak-what-why-and-how/

转载于:https://my.oschina.net/sonice/blog/189570

你可能感兴趣的文章
Postgres 中 to_char 格式化记录
查看>>
关于联合索引
查看>>
开源 java CMS - FreeCMS2.7 登录移动端管理中心
查看>>
Android FM模块学习之三 FM手动调频
查看>>
Python 设置系统默认编码以及其他编码问题大全
查看>>
Vbs脚本编程简明教程之十四
查看>>
如何UDP/TCP端口是否通了
查看>>
pxe实现系统的自动化安装
查看>>
Redis高可用技术解决方案总结
查看>>
Scale Out Owncloud 高可用(2)
查看>>
何为敏捷
查看>>
HA集群之四:Corosync+Pacemaker+DRBD实现HA Mysql
查看>>
服务器定义
查看>>
我的友情链接
查看>>
MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能
查看>>
c# 入门 例子
查看>>
HP Designjet 800PS 日常维护
查看>>
rhel7使用fdisk分区时无法使用全部分区的解决办法
查看>>
Docker 清理命令
查看>>
利用NRPE外部构件监控远程主机
查看>>