java最明显的一个优势就是它的内存管理机制。你只需简单创建对象,java的垃圾回收机制负责分配和释放内存。然而情况并不像想像的那么简单,因为在Java应用中经常发生内存泄漏。脚本代码

本教程演示了什么是内存泄漏,为什么会发生内存泄漏以及如何预防内存泄漏。

什么是内存泄漏?

定义:如果对象在应用中不再被使用,但由于它们在其他地方被引用,垃圾回收却不能移除它们(这样就造成了很多内存不能释放,从而导致内存溢出的现象。译注)。

要理解这一定义,我们需要理解内存中对象的状态。下图说明了那些是未使用,那些是未引用。

从图中可以看到被引用对象和未引用对象(的范围)。未引用对象可以被垃圾回收机制回收,而被引用对象不能被垃圾回收机制回收。未引用对象当然是没有使用的,因为没有其他对象引用了它。然而未使用对象并不都是未引用的。某些未使用的对象仍然被其他地方引用!这就是内存泄漏起因。简洁tab标签

为什么会发生内存泄漏?

让我们来下面的这个例子,看看为什么会发生内存泄漏。在如下例子中,A对象引用了B对象。A的生命周期(t1-t4)比B的生命周期(t2-t3)要长的多,当B不再在应用中被使用,A仍然持有对B的引用。这样一来,垃圾回收机制不能从内存中移除B。这很有可能导致内存溢出问题,因为如果其他很多对象像A一样,那么内存中将会有很多不能被回收的对象,这将消耗大量内存空间。

也有可能的情况是B持有了大量对其他对象的引用。这些被B引用的对象同样不会被回收掉。所有这些未使用的对象将会消耗宝贵的内存空间。

如何预防内存泄漏?

如下是一些预防内存泄漏的快速技巧:

1、留意集合类,比如HashMap,ArrayList等等,因为他们是内存泄漏经常发生的地方。当它们被声明为静态对象时,他们的生命周期就和应用的生命周期一样长。

2、留意事件监听器和回调。如果一个类注册了监听器,但当该类不再被使用后没有注销监听器,可能会发生内存泄漏。

3、“如果一个类管理自己的内存,程序员应该警惕内存泄漏。”[1],很多时候对象中的指向其他对象成员变量需要设置成null(才能被回收)。

(http://www.huiyi8.com/jiaoben/)

介绍 Java 的内存泄漏的更多相关文章

  1. Java提高篇—— 简单介绍Java 的内存泄漏

    java最明显的一个优势就是它的内存管理机制.你只需简单创建对象,java的垃圾回收机制负责分配和释放内存.然而情况并不像想像的那么简单,因为在Java应用中经常发生内存泄漏. 本教程演示了什么是内存 ...

  2. Java的内存泄漏和垃圾回收机制

    JAVA会产生内存泄露吗?首先,答案是肯定的. Java尽管有垃圾回收器,但依旧存在泄漏. Java内存泄漏跟C/C++内存泄漏的概念不一样:C/C++的内存泄漏是指Malloc了一些资源.最后没有f ...

  3. Java的内存泄漏_与C/C++对比(转载总结)

    原文网址:http://developer.51cto.com/art/201111/302465.htm Java内存泄露的理解与解决(1)   一般来说内存泄漏有两种情况.一种情况如在C/C++ ...

  4. Java JVM 内存泄漏--全解析和处理办法 [ 转载 ]

    Java JVM 内存泄露——全解析和处理办法 [转载]   @author 小筐子 @address http://www.jianshu.com/p/bf159a9c391a         JA ...

  5. 什么是内存溢出以及java中内存泄漏5种情况的总结

    内存泄漏定义(memory leak):一个不再被程序使用的对象或变量还在内存中占有存储空间. 一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出.内存溢出 out of memory ...

  6. java HashMap 内存泄漏

    import java.util.HashMap; import java.util.Map; public class HashMapOver { public static void main(S ...

  7. MAT工具定位分析Java堆内存泄漏问题方法

    一.MAT概述与安装 MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题.该工具提供了两种使用方式,一种是插件版,可以安装到Eclips ...

  8. Cocos性能优化工具的开发介绍Visual Studio内存泄漏检测工具——Visual Leak Detector

    然后,Windows下有什么好的内存泄漏检測工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检測功能.我们能够使用第三方工具Visual Leak Detector(下面简 ...

  9. Java的内存泄漏

    内存泄漏是指,无用对象(不再使用的对象)持续占用内存或者无用对象的内存得不到及时释放,从而造成的内存浪费 就说是有一块内存你不需要再用了,但是呢你还保留着它的指针,那么这块内存就不会被回收 举个例子 ...

随机推荐

  1. An internal error occurred Exception caught during execution of commit command

    在工程目录下找到 .git 文件夹 ,找到里面的 index.lock 文件,删掉再commit

  2. 每天一个 Linux 命令(57):ss命令

    ss是Socket Statistics的缩写.顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信 ...

  3. Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental……

    Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to th ...

  4. HDOJ 2829 Lawrence

    四边形不等式优化DP Lawrence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. fiddler不能监听 localhost和 127.0.0.1的问题 .

    localhost/127.0.0.1的请求不会通过任何代理发送,fiddler也就无法截获. 解决方案 用 http://localhost. (locahost紧跟一个点号) 用 http://1 ...

  6. 策略模式(headfirst设计模式学习笔记)

    鸭子的行为被封装 进入一组类中,能够轻易的扩展和改变.假设须要能够执行时改变行为! 策略模式定义了算法族.分别封装起来.让他们能够相互替换,此模式让算法的变化独立于使用算法的客户. 继承,相似之处用继 ...

  7. Android微信分享功能实例+demo

    Android微信分享功能实例 1 微信开放平台注册 2 获得appId,添加到程序中,并运行程序 3 使用应用签名apk生成签名,添加到微信开放平台应用签名,完成注册 4 测试分享功能. 有问题请留 ...

  8. win10多用户远程登录

    实现效果:不同的电脑可以同时登录一台windows主机,但是必须使用不同的账号 首先,我们来创建一个新用户 点击设置,搜索用户 点击下一步,一个普通用户就创建完成了. 然后,打开远程设置,右键此电脑, ...

  9. 试验笔记 - 使用7-ZIP压缩来减小APK安装包体积

    7-ZIP版本:9.20 x86 And x64 Windows(2010-11-18) 1. 将APK包解压到文件夹2. 全选所有文件,右键“添加到压缩包”3.“压缩格式”必须“zip”4.“压缩等 ...

  10. java mysql自定义函数UDF之调用c函数

    正如sqlite可以定义自定义函数,它是通过API定义c函数的,不像其他,如这里的mysql.sqlite提供原生接口就可以方便的调用其他语言的方法,同样的mysql也支持调用其它语言的方法. goo ...