Java内存泄漏的介绍

Java最重要的优势之一是它的内存管理。您只需创建对象,Java Garbage Collector负责分配和释放内存。但是,情况并不那么简单,因为Java应用程序中经常发生内存泄漏。

本教程说明了什么是内存泄漏,它发生的原因以及如何防止它们。

1.什么是记忆泄漏?

内存泄漏的定义:应用程序不再使用对象,但垃圾收集器无法删除它们,因为它们被引用。

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

从图中可以看到引用的对象未引用的对象。未引用的对象将被垃圾收集,而引用的对象将不会被垃圾收集。未引用的对象肯定未使用,因为没有其他对象引用它。但是,未使用的对象并非全部未引用。其中一些被引用!这就是内存泄漏的来源。

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

让我们看一下下面的例子,看看为什么会发生内存泄漏。在下面的示例中,对象A引用对象B.A的生命周期(t1-t4)比B(t2-t3)长得多。当B不再在应用程序中使用时,A仍然保留对它的引用。这样,垃圾收集器无法从内存中删除B. 这可能会导致内存不足问题,因为如果A对更多对象执行相同的操作,那么会有很多未收集的对象并占用内存空间。

B也可能拥有一堆其他对象的引用。B引用的那些对象也不会被收集。所有这些未使用的对象将消耗宝贵的内存空间

3.如何防止内存泄漏?

以下是一些防止内存泄漏的快速实用技巧。

  1. 请注意Collection类,例如HashMap,ArrayList等,因为它们是查找内存泄漏的常见位置。声明static它们时,它们的使用寿命与应用程序的使用寿命相同。
  2. 注意事件监听器和回调。如果监听器已注册但在不再使用该类时未注册,则可能发生内存泄漏。
  3. “如果一个类管理自己的内存,那么程序员应该警惕内存泄漏。”[1]通常,指向其他对象的对象的成员变量必须为空。

4.一点测验:为什么JDK 6中的substring()方法会导致内存泄漏?

要回答这个问题,您可能需要阅读JDK 6和7中的Substring()。

参考文献:
[1]布洛赫,约书亚。有效的java。Addison-Wesley Professional,2008。
[2] IBM Developer Work。http://www.ibm.com/developerworks/library/j-leaks/

转载来源:https://www.programcreek.com/2013/10/the-introduction-of-memory-leak-what-why-and-how/

Java内存泄漏的介绍相关推荐

  1. Java内存泄漏介绍

    转载自 Java内存泄漏介绍 内存管理是Java最重要的优势之一,你只需创建对象,Java垃圾收集器会自动负责分配和释放内存.但是,情况并不那么简单,因为在Java应用程序中经常发生内存泄漏. 本章会 ...

  2. 一次恐怖的 Java 内存泄漏排查实战

    转载自  一次恐怖的 Java 内存泄漏排查实战 最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>(第二版)这本书,理论+实践结合,深入浅出,强烈推荐给大家. 这两天对JVM内 ...

  3. unity如何检测内存泄漏_如何排查Java内存泄漏?看懂这一篇就够用了

    原文:https://www.toptal.com/java/hunting-memory-leaks-in-java 作者:Jose Ferreirade Souza Filho 译者:Emma来源 ...

  4. java内存泄漏怎么检测_JAVA内存泄漏原因和内存泄漏检测工具

    JAVA内存泄漏原因和内存泄漏检测工具 摘要 虽然Java 虚拟机(JVM)及其垃圾收 集器(garbage collector,GC)负责管理大多数的内存任务,Java 软件程序中还是有可能出现内 ...

  5. Java内存泄漏的排查

    1.内存溢出 一种通俗的说法. 1.内存溢出:你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数据,出现溢出. 2.内存泄漏:你用new申请了一块内存,后来很长时间都不再使用了(按理应该 ...

  6. Java内存泄漏分析和解决

    1. 什么是内存泄漏? 内存泄漏:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着. 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是 ...

  7. Java内存泄漏系列--匿名内部类导致内存泄露--原因/解决方案

    原文网址:Java内存泄漏系列--匿名内部类导致内存泄露--原因/解决方案_IT利刃出鞘的博客-CSDN博客 简介 说明 本文用示例介绍匿名内部类会导致内存泄漏的原因及其解决方案. 相关网址 普通内部 ...

  8. java内存泄漏笔记

    利用jdk6查内存泄漏(见编写对GC友好,又不泄漏的代码) (1)jmap -dump:file=heap_file_name pid 会产生一个heap_file_name文件 (2)jhat he ...

  9. java内存泄漏总结

    内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题.内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收 ...

最新文章

  1. Jquery中发送ajax请求示例代码
  2. 「Python-Bug」matplotlib画图时报错Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
  3. “ORA-01034 - Oracle not available”和“ORA-27101 - shared memory realm does not exist”
  4. lua学习笔记(三)
  5. Map3D/MapGuide API中如何计算两点间的距离?
  6. 在ehlib的DBGridEh控件中使用过滤功能(可以不用 MemTableEh 控件 适用ehlib 5.2 ehlib 5.3)...
  7. Mysql如何清空数据库中所有的表数据
  8. protel99实用基础入门教程
  9. 国家或地区内期货市场竞争格局的变迁
  10. 人工智能:声纹相关基础概念介绍
  11. 本人有一个60G的金士顿的固态硬盘,测了4K分区对齐前后的区别,发现性能相差很大...
  12. journal日志部分参数理解
  13. Maven项目报错 系统找不到指定的路径 问题解决
  14. 【Latex】算法排版规律(中文排版)
  15. 6至7月不良与垃圾信息举报:垃圾短信占52.3%
  16. Linux系统终端分屏——实用小技巧
  17. 人教版初中英语听力软件,人教版初中英语听力mp3
  18. wps合并所有sheet页_wps表格多个sheet合并
  19. 西安java培训,稳进大厂
  20. Shell编程——循环(for、while、until、break与continue)

热门文章

  1. Swift快速参考手册
  2. CakePHP 中文手册
  3. ORB-SLAM2介绍(1)
  4. Oracle删除用户与删除表
  5. Linux——ubuntu硬盘分区
  6. 《C和指针》——字符数组和字符串常量的区别
  7. 【今日CS 视觉论文速览】 9 Jan 2019
  8. 字段与属性 关于类的封装 c# 1229
  9. java演练 数组的逆序文字玩法 你是猪才怪
  10. Linux删除乱码文件