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 ...
随机推荐
- Centos7.3 进入救援模式,解决虚拟机开机引导只能看到一个横杠
问题描述:搭建在CAS服务器中的虚拟机开机后只能看到一个横杠,因为开发同事的一些操作使glibc库/lib64/libc.so.6软链接失效 1.libc.so.6 是c运行时库 glibc的软链接, ...
- mysql数据库-简介
目录 1 MySQL 的三大主要分支 1.1 官方文档 1.2 版本演变 1.3 MySQL 安装方式 1.3.1 RPM包安装Mysql 1.3.2 二进制安装MySQL 1.4 mysql组成 1 ...
- system verilog内建数据类型
- Cannot resolve class or package 'mysql’处理方法
在application.properties中配置mybatis_plus碰见报了这个错误 Cannot resolve class or package 'jdbc' 错误产生的原因 其实这个问题 ...
- [leetcode] 874. 行走机器人模拟(周赛)
874. 行走机器人模拟 模拟 描述方向时有个技巧:int[][] dx = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; 分别存储机器人向上.右.下.左走时,坐标应该如何变 ...
- 重型车辆盲区行为检查Behaviours – Heavy Vehicle Blind Spots
重型车辆盲区行为检查Behaviours – Heavy Vehicle Blind Spots VISIBILITY AROUND HEAVY VEHICLES A blind spot is an ...
- TensorFlow实现多层感知机MINIST分类
TensorFlow实现多层感知机MINIST分类 TensorFlow 支持自动求导,可以使用 TensorFlow 优化器来计算和使用梯度.使用梯度自动更新用变量定义的张量.本文将使用 Tenso ...
- NSight Compute 用户手册(下)
主菜单 文件 新建项目使用"新建项目"对话框创建新的分析项目 4. Main Menu and Toolbar Information on the main menu and t ...
- 使用Nginx配置服务静态文件(图片,文本,视频等)
安装Nginx 安装Nginx较为简单,请参考下方链接或自行百度. 参考链接:https://blog.csdn.net/qq_26666947/article/details/112272058 以 ...
- 二、部署监控服务器-Zabbix Server
二.部署监控服务器-Zabbix Server 1)源码安装Zabbix Server 多数源码包都是需要依赖包的,zabbix也- 样,源码编译前需要先安装相关依赖包. [root@zabbixse ...