java内存泄露问题

xiaowangzaixian 2011-12-12 09:35:07
有时候为了避免内存泄露,使用静态内部类来取代非静态内部类,为什么呢?
...全文
127 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiakai0419 2011-12-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 nj_dobetter 的回复:]

非静态内部类的对象默认包含了它的Container的引用,比如:
class A{
class B{

}
}

B的对象中默认有一个A的引用,垃圾回收的时候,如果处理不当,有可能导致A的对象不能被回收,导致内存泄漏。
[/Quote]


这个是对的。
smst1987 2011-12-12
  • 打赏
  • 举报
回复
非静态内部类与外部类相互引用,jvm不知道何时去gc,就会出现泄露。
静态内部类就不会影响外部类的destroy
wangfeiwoyun 2011-12-12
  • 打赏
  • 举报
回复
NND,为啥沙发老被抢呢。
wangfeiwoyun 2011-12-12
  • 打赏
  • 举报
回复
你要一个静态内部类(题外话:static的不叫内部类,叫:nested class)实例的时候,你并不需要一个外部类的实例(Enclosing Instance),比如:

class T {
static class Nested {
void sayHello() {
System.out.println("hello");
}
}
}

class C {
public static void main(String... args) {
new T.Nested().sayHello(); //不需要外部类T的实例,这里T只是一个类Nested的限定名称的一部分
}
}

内部类(非static的nested class)就不一样了,你要实例化一个内部类,必须要有一个外部类的实例,比如:

class T {
class Nested {
void sayHello() {
System.out.println("hello");
}
}
}

class C {
public static void main(String... args) {
new T().new Nested().sayHello(); // 外部类T的实例 new T()是必须的
}
}

如果你的内部类中并不需要外部类的实例变量,实例方法的话,那么其实你只需要内部类的实例就够了,但是又必须得有个外部类的实例,虽然你用不到。
如果你有很多内部类的实例,是由不同的外部类的实例创建的,虽然没有其他的对象引用你的外部类对象,但内部类引用了(内部类对象在创建的时候虚拟机会自动把外部类对象的实例传进去作为一个实例变量保存),所以GC不能够回收这写外部类对象,这样就有可能造成内存泄露。
所以呢,既然你并不需要外部类的实例变量,实例方法,你加上一个static关键字,就不许要外部类对象了。
nj_dobetter 2011-12-12
  • 打赏
  • 举报
回复
换成静态内部类后,默认引用就没有了,比如:
class A{
static class B{

}
}
B的对象中就没有对A对象的引用。
nj_dobetter 2011-12-12
  • 打赏
  • 举报
回复
非静态内部类的对象默认包含了它的Container的引用,比如:
class A{
class B{

}
}

B的对象中默认有一个A的引用,垃圾回收的时候,如果处理不当,有可能导致A的对象不能被回收,导致内存泄漏。

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧