关于Java内存泄漏的介绍
翻译自这篇文章
Java一个最显著的优势就是它的内存管理。你只需要简单地创建对象,而Java垃圾收集器会负责内存的分配与释放。不过,事情并没有那么简单,因为在Java应用中时常会出现内存泄漏。
1. 什么是内存泄漏?
内存泄漏的定义: 对象不再被程序使用,但是因为它们仍在被引用导致垃圾收集器无法删除它们。
要理解这个定义,我们首先需要理解对象在内存中的状态。下图说明了什么是无使用的,以及什么是无引用的。

由上图可知,内存中有引用对象和无引用对象。无引用对象会被垃圾收集处理掉,而引用对象不会被当做垃圾处理。无引用对象一点是无使用的,因为没有其它对象与它关联。但是,无使用对象不一定是无引用的。其中有一些是被引用的!这就是内存泄漏的由来。
2. 为什么会发生内存泄漏?
我们来根据下面的例子看看为什么会发生内存泄漏。在下面的例子中,对象A引用了对象B。A的生命周期(t1 - t4)要比B的生命周期(t2 - t3)长很多。当B不再被程序使用时,A仍然保持对B的引用。这种情况下,垃圾收集器就无法从内存中删除B。这可能会造成内存不足的问题,因为如果A对更多的对象都是同样的引用,那么就会有很多无法收集的对象消耗内存空间。
也有可能B对一些其它的对象保留着引用。那些被B引用的对象也将无法被回收。所有这些未被使用的对象都将消耗宝贵的内存空间。

3. 如何避免内存泄漏?
下面是一些避免内存泄漏的实用技巧。
- 注意集合类,如HashMAP,ArrayList,等等,因为这些地方经常出现内存泄漏。当它们被声明为
static时,它们的生命周期就与应用本身一样长。 - 注意时间监听器与回调函数。对于一个已注册的监听器,如果对应类不再被使用的时候,它没有被注销,那么也可能会发生内存泄漏。
- “如果一个类可以管理它自己的内存,那么程序员就应该警惕内存泄漏的问题”。通常,一个类中指向其它类的成员变量需要被清空。
关于Java内存泄漏的介绍的更多相关文章
- Java内存泄漏分析与解决方案
Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历 ...
- OutOfMemoryError异常java内存泄漏(Memory Leak)和内存溢出(Memory Overflow)
本篇文章理解源自于<深入理解java虚拟机>2.4章节 实战:OutOfMemoryError异常 在以下例子中,所有代码都可以抛出OutOfMemoryError异常,但是要区分到底 ...
- 如何排查Java内存泄漏?看完我给跪了!
没有经验的程序员经常认为Java的自动垃圾回收完全使他们免于担心内存管理.这是一个常见的误解:虽然垃圾收集器做得很好,但即使是最好的程序员也完全有可能成为严重破坏内存泄漏的牺牲品.让我解释一下. 当不 ...
- Java内存分析简单介绍
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11904422.html Java内存分析简单介绍: 1. # 设置内存溢出时自动生成堆内存快照 ...
- java内存泄漏的几种情况
转载于http://blog.csdn.net/wtt945482445/article/details/52483944 Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是静态 ...
- java内存泄漏的定位与分析
1.为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题. 编写java程序最为方便的地方就是我们不需要管理内存的分配和释放, ...
- java内存泄漏
java内存泄漏主要分成两个方面: (1)堆中申请的空间没有被释放 (2)对象已不在被使用,但是仍然存在在内存当中 以下集中情况可能会导致内存泄漏 (1)静态集合的使用hashmap和vector,静 ...
- (转)java内存泄漏的定位与分析
转自:http://blog.csdn.net/x_i_y_u_e/article/details/51137492 1.为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测, ...
- Java内存泄漏分析系列之五:常见的Thread Dump日志案例分析
原文地址:http://www.javatang.com 症状及解决方案 下面列出几种常见的症状即对应的解决方案: CPU占用率很高,响应很慢 按照<Java内存泄漏分析系列之一:使用jstac ...
随机推荐
- 前端快闪四: 拦截axios请求和响应
马甲哥继续在同程艺龙写一点大前端: 今天我们来了解一下 如何拦截axios请求/响应? axios是一个基于 promise 的网络请求库,可以用于浏览器和 node.js, promise 类似于C ...
- 阿里 Midway 正式发布 Serverless v1.0,研发提效 50%
Github:https://github.com/midwayjs/midway 开源为了前端和 Node.js 的发展,点 Star! 去年阿里提出 Serverless 架构,并利用其新一代研发 ...
- WIN10下的VMware与Docker冲突的解决方案
VMARE版本升级到15.5以上 WIN10升级到2004版本以上 Hyper-V为开启状态
- JavaScript表单输入合法控制
写在前面 为了提高数据输入的容错性和数据库数据的安全性,除了后端对输入的数据的逻辑判断处理,还可以前端页面高效率处理,从而提高系统的可靠性,下面是这次项目中的自己写的一些符合当时需要的控制. 账号位数 ...
- 用C++实现的数独解题程序 SudokuSolver 2.3 及实例分析
SudokuSolver 2.3 程序实现 用C++实现的数独解题程序 SudokuSolver 2.2 及实例分析 里新发现了一处可以改进 grp 算法的地方,本次版本实现了对应的改进 grp 算法 ...
- Redis 基础数据类型重温
有一天你突然收到一条线上告警:Redis 内存使用率 85%.你吓坏了赶紧先进行扩容然后再去分析 big key.等你进行完这一系列操作之后老板叫你去复盘,期间你们聊到了业务的数据存储在 Redis ...
- NC105 二分查找法
二分查找(一) 二分查找看似简单,但是有很多的细节要注意. 题目是牛客NC105,找到有序数组中第一个大于或者等于所查找的数字. 初步写了如下的代码: class Solution { public: ...
- Linux下有用的命令
ldd 查看依赖的动态库 加上-r可以查看未定的符号 c++ filt 通过编译换名后的函数名查找某经过编译器换名前的函数名 csh 切换c shell source .chsrc 可以刷新环境变量 ...
- f(sinx)到底是啥
总结一句:cosx是偶次就一定可以用.
- 基础篇:JAVA集合,面试专用
没啥好说的,在座的各位都是靓仔 List 数组 Vector 向量 Stack 栈 Map 映射字典 Set 集合 Queue 队列 Deque 双向队列 关注公众号,一起交流,微信搜一搜: 潜行前行 ...