前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java内存泄漏问题

java内存泄漏问题

作者头像
宇宙无敌暴龙战士之心悦大王
发布2022-03-14 11:03:28
4260
发布2022-03-14 11:03:28
举报
文章被收录于专栏:kwaikwaikwai

主要问题

1,长生命周期对象持有短周期的引用,导致短周期对象不被回收。

2,大量的长周期对象不能回收。

例子和解决

1,大量的数据库或者文件链接

代码显示的关闭就行。

2,静态对象(如hashmap这种集合),里面存大量的短期对象的引用。

 Static Vector v = new Vector(10); 
 for (int i = 1; i<100; i++) 
 { 
 Object o = new Object(); 
 v.add(o); 
 o = null; 
 }

这里随便o引用了null,但是并没有解决new的应用。

3,因为修改对象导致hashcode改变,导致remove失败。

public static void main(String[] args) 
{ 
Set<Person> set = new HashSet<Person>(); 
Person p1 = new Person("唐僧","pwd1",25); 
Person p2 = new Person("孙悟空","pwd2",26); 
Person p3 = new Person("猪八戒","pwd3",27); 
set.add(p1); 
set.add(p2); 
set.add(p3); 
System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:3 个元素! 
p3.setAge(2); //修改p3的年龄,此时p3元素对应的hashcode值发生改变 
 set.remove(p3); //此时remove不掉,造成内存泄漏
 set.add(p3); //重新添加,居然添加成功 
 System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:4 个元素! 
 for (Person person : set) 
 { 
 System.out.println(person); 
 } 
 }

4,调用外部模块

因为调用外部模块,导致被引用的模块一直有引用。

5,单例模式

因为单例模式的生命周期和进程一样。

所以如果单例模式持有对象的引用,这个对象也会一直活着。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 主要问题
  • 例子和解决
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档