黑马程序员技术交流社区

标题: 关于内存溢出的问题 [打印本页]

作者: 张权    时间: 2012-11-27 08:48
标题: 关于内存溢出的问题
本帖最后由 张权 于 2012-11-27 11:42 编辑

class Demo
{
                Demo d = new Demo();//这个代码会内存溢出,为什么把这里改成 static Demo d = new Demo()就不会内存溢出了呢?        
               
}
class DemoDemo
{
                public static void main(String[] args)
                {
                                System.out.println(new Demo());        
                }        
}

作者: 齐银春    时间: 2012-11-27 09:15
改成静态后,类一加载就会被加载,因为静态会一直存在直到此类的消亡,不会再被加载,所以不会有内存溢出
作者: 张权    时间: 2012-11-27 09:45
齐银春 发表于 2012-11-27 09:15
改成静态后,类一加载就会被加载,因为静态会一直存在直到此类的消亡,不会再被加载,所以不会有内存溢出 ...

这个我知道,静态是随着类的加载而加载,但是与内存不会溢出有什么关系呢?
我还是主函数先new 一个对象,然后这个对象 有一个 属性d, 这个d有一个显示初始化值new Demo(), 因为是new Demo()所以这个显示初始化值"new Demo()"  又会有一个默认属性d和一个显示初始化值new Demo(),这样就一直循环了啊!!
作者: 刘子义    时间: 2012-11-27 09:55
张权 发表于 2012-11-27 09:45
这个我知道,静态是随着类的加载而加载,但是与内存不会溢出有什么关系呢?
我还是主函数先new 一个对象 ...

非静态的时候每次都会在堆中开辟一块内存空间,静态就只占用了一块内存
作者: yingying    时间: 2012-11-27 10:01
  Demo d = new Demo();这句代码应该在构造函数中吧,不然都不会执行,怎么会溢出呢?你静态的东西在内存中是共享的,只需要加载一次就在不加载了,也就是不会出现你上面的那种循环;一般在构造函数中new对象都会因为递归导致内存溢出的。只要你在主函数中new Demo()一次,然后就会在 Demo类中递归创建对象,直到内存溢出!
作者: 张权    时间: 2012-11-27 10:53
本帖最后由 张权 于 2012-11-27 10:58 编辑
yingying 发表于 2012-11-27 10:01
Demo d = new Demo();这句代码应该在构造函数中吧,不然都不会执行,怎么会溢出呢?你静态的东西在内存 ...


我理解错了????其实 Demo d = new Demo()这句话是在   构造函数里面》?也就是说其实代码还原就应该是这样:class Demo
{
                Demo()
                {
                                Demo d = new Demo();        
                }        
}
class DemoDemo
{
                public static void main(String[] args)
                {
                                System.out.println(new Demo());
                }        
}正确理解上面代码会无限循环,应该是这样理解对吗??但是还是不明白静态修饰后就不会循环了,你说只开辟一片空间,就不开辟了,能不能帮忙画个图说明下,谢谢了!!
作者: 张学永    时间: 2012-11-27 11:01
张权 发表于 2012-11-27 10:53
我理解错了????其实 Demo d = new Demo()这句话是在   构造函数里面》?也就是说其实代码还原就应该 ...

Demo d = new Demo(),不加静态修饰的话,放在成员位置,和放在构造函数里面,效果都会造成内存溢出。
因为它们都在初始化的时候,进行了赋值操作,就是去new 对象了,然后被new的这个对象又有这么个属性,接着去new对象,肯定就循环了啊。
加了静态以后,可以放在成员位置上,但是不可以放在构造函数里。加静态放在成员位置上,只要类加载就产生这么个成员对象,并且被所有对象共享,以后再new的对象都不会再执行静态代码。就不会死循环了。
个人这么理解的。
作者: 张权    时间: 2012-11-27 11:20
张学永 发表于 2012-11-27 11:01
Demo d = new Demo(),不加静态修饰的话,放在成员位置,和放在构造函数里面,效果都会造成内存溢出。
因 ...

我刚想了一下,不知道这样理解对不对,  首先主函数 创建对像 Demo d =  new Demo(),然后这个对像有一个被静态修饰属性d,然后这个静态变量d 有一个显示初始化值 new Demo(),按说它是会继续new 下去的,但是因为 d是静态变量,如果再去new,类就会再去加载一次,而类已经加载了,不会在加载了!!





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2