Java 内存泄漏知多少?
先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索【程序职场】关注这个执着的职场程序员。
我有什么:职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验。
面试的时候内存管理是不是很多面试官会问呢?
不知道别人面试都是什么套路,但我面试了很多人,有80%的次数我会问内存管理的有关知识。
因为内存会引起一个很头疼的问题,内存泄漏,造过这个bug或者查找过这个bug的人都会偷偷抹眼泪,哎 都是泪啊,哥的头发掉了一根有一根。
内存管理是Java最重要的优势之一,你只需创建对象,Java垃圾收集器会自动负责分配和释放内存。但是,情况并不那么简单,因为在Java应用程序中经常发生内存泄漏。
那么 什么是内存泄漏,为什么发生,以及如何防止它们。
01
内存泄漏概念?
内存泄漏的定义:应用程序不再使用的对象,垃圾收集器却无法删除它们,因为它们正在被引用。
为了理解这个定义,我们需要了解对象在内存中的状态。下图说明了什么是未引用的,什么是引用的对象。
从图中可以看出,有被引用的对象和未被引用的对象。未引用的对象将被垃圾收集,而被引用的对象将不会被垃圾收集。未引用的对象肯定是未使用的,因为没有其他对象引用它。但是,未使用的对象并不是全部未被引用,其中一些被引用!这是内存泄漏的来源。
02
为什么内存泄漏发生?
让我们来看看下面的例子,看看为什么发生内存泄漏。在下面的例子中,对象A是指对象B。A的生命周期(t1 - t4)比B的(t2 - t3)长得多,当应用中不再使用B时,A仍然有一个B的引用,这样垃圾收集器就不能从内存中删除B。这就可能会导致内存不足的问题,因为如果A同时为更多的对象做同样的事情,那么会有很多像B这样的对象没有收集并占用内存空间。
B也可能拥有一堆其他对象的引用,B引用的对象也不会被收集。所有这些未使用的对象将消耗宝贵的内存空间。
03
如何防止内存泄漏?
以下是防止内存泄漏的一些快速实用技巧。
注意集合类,如HashMap、ArrayList等,因为它们是发现内存泄漏的常见地方。当它们被声明为静态时,它们的生命时间与应用程序的生命时间是相同的。
注意事件监听器和回调。如果一个侦听器被注册了,但是当类不再被使用时,可能会发生内存泄漏。
如果一个类管理自己的内存,程序应该对内存泄漏保持警惕。通常情况下,指向其他对象的成员变量需要为null值。
04
发生内存泄漏几种情况
1,静态容器,如HashMap、ArrayList,静态容器中保有着其他无用对象的引用,会导致无用对象无法被回收,而静态的容器的生命周期是与进程生命周期一致的。
2,容器如HashSet中修改了其中的值,因为HashSet内部是封装了HashMap的,所以当对HashSet中的元素进行修改时,会改变该元素的HashCode,也就是说会改变该元素在HashMap中的存放位置,但是由于没有改变在HashSet中的存放位置,因此使用remove()方法都无法进行移除,这就会造成内存泄漏。(这里需要对HashCode 和 Equal方法进行重写)
3,使用单例模式,这是因为单例模式static的对象是存放在方法区中的。不会被回收。
4,没有释放的资源连接,如数据库连接、网络连接等。这种资源的连接只有代码中显示的调用close()才能够关闭资源,如果没有调用close()方法,资源连接是不会被GC垃圾回收器回收的。
我是【尔东双月】一枚执着的职场程序员,微信搜索【程序职场】关注我。别忘了三连啊,点赞、收藏、留言,随意给,我不挑。
知乎号: 程序职场
注:如果文章有任何问题,欢迎毫不留情地指正。
Java 内存泄漏知多少?的更多相关文章
- 如何排查Java内存泄漏?看完我给跪了!
没有经验的程序员经常认为Java的自动垃圾回收完全使他们免于担心内存管理.这是一个常见的误解:虽然垃圾收集器做得很好,但即使是最好的程序员也完全有可能成为严重破坏内存泄漏的牺牲品.让我解释一下. 当不 ...
- java内存泄漏的几种情况
转载于http://blog.csdn.net/wtt945482445/article/details/52483944 Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是静态 ...
- java内存泄漏的定位与分析
1.为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题. 编写java程序最为方便的地方就是我们不需要管理内存的分配和释放, ...
- java内存泄漏
java内存泄漏主要分成两个方面: (1)堆中申请的空间没有被释放 (2)对象已不在被使用,但是仍然存在在内存当中 以下集中情况可能会导致内存泄漏 (1)静态集合的使用hashmap和vector,静 ...
- Java内存泄漏分析与解决方案
Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历 ...
- (转)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 ...
- Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析
原文地址:http://www.javatang.com 一个典型的thread dump文件主要由一下几个部分组成: 上图将JVM上的线程堆栈信息和线程信息做了详细的拆解. 第一部分:Full th ...
- Java内存泄漏分析系列之一:使用jstack定位线程堆栈信息
原文地址:http://www.javatang.com 前一段时间上线的系统升级之后,出现了严重的高CPU的问题,于是开始了一系列的优化处理之中,现在将这个过程做成一个系列的文章. 基本概念 在对J ...
随机推荐
- 10.11 arping:发送arp请求
arping命令 是用于发送arp请求到一个相邻主机的工具,arping使用arp数据包检查局域网内所有设备的硬件地址. arping 命令的参数选项及说明 -c <次数> ...
- 第14讲 | HTTP协议:看个新闻原来这么麻烦
第14讲 | HTTP协议:看个新闻原来这么麻烦 http://www.163.com 是个 URL,叫作统一资源定位符. 之所以叫统一,是因为它是有格式的.HTTP 称为协议,www.163.com ...
- java IO教程《三》
缓冲区流讲解(Buffered) 什么是缓冲区? 缓冲流,也叫高效流,是对4个基本的File流的增强,所以也是4个流,按照数据类型分类: 字节缓冲流:BufferedInputStream,Buffe ...
- Lombok中的@Builder注解
1.前言 今天在看项目代码的时候, 遇到了实体类上加@Builder注解, 之前在开发的时候, 一直没有用过这个注解, 便兴致勃勃地去查了一下资料, 它也是Lombok中的注解, 我们都知道Lombo ...
- python报错“AttributeError: 'set' object has no attribute 'items'“
作为才开始学爬虫的萌新,遇到了一个这样的错,很懵逼 后面到网络到处查看大佬的解决方法,才发现headers的请求头部信息有错误,headers是一个字典,不是字符串,所以报错了 原代码 headers ...
- ALD技术产品形态
ALD技术产品形态 原子层沉积研究设备 TFS 200是适合科学研究和企业研发的最灵活的ALD平台.倍耐克 TFS 200专门设计用于多用户研究环境中把可能发生的交叉污染降至最低. 大量的可用选项和升 ...
- 蓝牙mesh网络技术的亮点
蓝牙mesh网络技术的亮点 The highlights of Bluetooth mesh networking technology 导言 蓝牙是当今最主要的低功耗无线技术之一,对无线设备用户和开 ...
- Ubuntu18.04的下载与安装(全过程纪录)
unbuntu18.04的下载与安装 注:由于大部分过程是以图片形式说明,所以可能会导致网页浏览不流畅 前言 有时候由于个人计算机中文件的频繁移动,导致虚拟机的镜像文件有时候莫名删除了或者不见了(说到 ...
- sql:group by和 max
通过group by,having,max实现查询出每组里指定列中最大的内容 例如:我需要实现的功能是 获取每个模块中点击量最大的内容(表中有许多内容,内容里) 我写的查询语句如下 查询结果如下: 然 ...
- pandas的数据结构介绍(一)—— Series
pandas两个主要数据结构之一--Series 类似于一维数组,由一组数据和与其相关的一组索引组成 obj = Series([4, 7, -5, 3], index=['d', 'b', 'a', ...