Java中的内存泄露的几种可能
Java内存泄漏引起的原因:
内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。
长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不再需要,但是因为长生命周期持有它的引用而导致不能被回收,这就是Java中内存泄漏的发生场景。
造成内存泄漏的几种情况:
1、静态集合类引起内存泄漏
像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,因为他们也将一直被Vector等引用着。
2、当集合里面的对象属性被修改后,再调用remove()方法时不起作用。
3、监听器
在释放对象的时候却没有去删除这些监听器,增加了内存泄漏的机会。
4、各种连接
比如数据库连接(dataSourse.getConnection()),网络连接(socket)和io连接,除非其显式的调用了其close()方法将其连接关闭,否则是不会自动被GC 回收的。
5、内部类和外部模块的引用
内部类的引用是比较容易遗忘的一种,而且一旦没释放可能导致一系列的后继类对象没有释放。此外程序员还要小心外部模块不经意的引用,例如程序员A 负责A 模块,调用了B 模块的一个方法如: public void registerMsg(Object b); 这种调用就要非常小心了,传入了一个对象,很可能模块B就保持了对该对象的引用,这时候就需要注意模块B 是否提供相应的操作去除引用。
6、单例模式
不正确使用单例模式是引起内存泄漏的一个常见问题,单例对象在初始化后将在JVM的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部的引用,那么这个对象将不能被JVM正常回收,导致内存泄漏。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
JVM调优总结(7):调优方法
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/81057240 Jconsole,jProfile,VisualVM Jconsole :jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。详细说明参考这里 JProfiler:商业软件,需要付费。功能强大。详细说明参考这里 VisualVM:JDK自带,功能强大,与JProfiler类似。推荐。 如何调优 观察内存释放情况、集合类检查、对象树 上面这些调优工具都提供了强大的功能,但是总的来说一般分为以下几类功能 堆信息查看 可查看堆空间大小分配(年轻代、年老代、持久代分配) 提供即时的垃圾回收功能 垃圾监控(长时间监控回收情况) 查看堆内类、对象信息查看:数量、类型等 对象引用情况查看 有了堆信息查看方面的功能,我们一般可以顺利解决以下问题: –年老代年轻代大小划分是否合理 –内存泄漏 –垃圾回收算法设置是否合理 线程监控 线程信息监控:系统线程数量。 线程状态监控:各个线程都处在什么样的状...
- 下一篇
这个界面好酷炫,麻麻我也要当程序媛!(Python+Sublime Text环境配置)
之前学python爬虫,每次都在sublime里写好程序,在cmd里用命令行输入命令打开。 碰巧我这个人很喜欢多弄几个文件夹,把文件分门别类放好。于是乎,每次cd命令都写个老半天,累得要死。用户体验极差。 学了秦老师的数据分析课以后,开始用anaconda。Anaconda亲切的用户体验让我不禁也开始同意:python大法好! 不过,和sublime比起来,anaconda白色的界面还是略显土气了,一点都没有sublime黑底彩字的高逼格↓ 这种酷炫的,牛逼哄哄的界面,才像程序媛嘛!! 一颗渴望装逼的心,驱动我寻找配置python+sublime环境的方法。 为了不让以后年迈的我忘记(毕竟年纪大了,记忆力真的差到不行),同时也想让更多渴望优(zhuang)雅(bi)地写代码的童鞋们学会sublime,所以想写个博文记录一下。 1、安装程序 首先当
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果