黑马程序员技术交流社区

标题: 学习面向对象时遇到的内存问题 [打印本页]

作者: 曾宇    时间: 2014-6-6 16:23
标题: 学习面向对象时遇到的内存问题
本帖最后由 曾宇 于 2014-6-7 18:31 编辑

class test{}

main{
    test t = new test();
}

1问:
开辟了栈内存空间,有一个变量t,存放堆内存地址new test();
这样理解是否正确?
2问:
如果直接使用new test();
是否表示只开辟了堆内存空间,而没有栈内存空间,由于没有引用,所以堆内存会被java垃圾回收机制回收。
但是,new test();毕竟开辟了堆地址,
那么是否可以使用new test().函数()。或者new test().成员变量?
3问:
如果class test{}类中没有任何方法,new test();是否还是会开辟内存空间。
是否是因为java自动加入的空构造函数,所以开辟空间。
如果使用test t = new test();
是否会造成无意义的占用内存空间?如果无限创建,是否会内存溢出?


作者: yuZhe_toString    时间: 2014-6-6 18:32
基本上你说的都对,但是对于开发来说没必要纠结这个。内存的问题其实很复杂,远没有像视频中说的那么简单,视频中只是说明了一个大框。如果你实在纠结推荐你一本书《深入理解java虚拟机》,但是理解起来真的不容易。
作者: Wokno    时间: 2014-6-6 18:42
你的第1个问题如你所说的那样。
第2个问题是匿名对象的使用,你可以去看看。
第3个问题,class tet{}; 中肯定包含一个空的构造方法,以及其从Object类中继承的所有东西。肯定会分配内存的。
如果你对new出来的东西一直没有释放掉对它的引用的话,java的垃圾收集机制肯定是无法对其进行回收的,当你创建的对象足够多时,肯定会内存溢出。
作者: 曾宇    时间: 2014-6-7 18:31
Wokno 发表于 2014-6-6 18:42
你的第1个问题如你所说的那样。
第2个问题是匿名对象的使用,你可以去看看。
第3个问题,class tet{}; 中肯 ...

谢谢你的解答,理解更深刻了。扫清了我的疑惑。
作者: 王者之风西昆仑    时间: 2014-12-29 16:36
Wokno 发表于 2014-6-6 18:42
你的第1个问题如你所说的那样。
第2个问题是匿名对象的使用,你可以去看看。
第3个问题,class tet{}; 中肯 ...

解释的非常清楚
作者: DxxD    时间: 2015-3-10 09:50
楼主研究的很深。。。
作者: RogerZhang    时间: 2015-5-20 00:40
现在终于理解了
作者: 289308575    时间: 2015-8-28 16:28
Wokno 发表于 2014-6-6 18:42
你的第1个问题如你所说的那样。
第2个问题是匿名对象的使用,你可以去看看。
第3个问题,class tet{}; 中肯 ...

首先感谢wokno的解答  想知道引用什么时候算是释放掉了?是在当前线程执行完毕算是释放掉呢?还是可以手动释放?还是其他的什么情况?
作者: 灵韵依存    时间: 2015-11-22 22:09
正在消化中   
作者: 小河北    时间: 2015-12-5 23:31
谢谢楼主
作者: fanhongwei1105    时间: 2016-5-24 23:13
又学习了一遍
作者: innovator    时间: 2016-5-31 18:25
楼主和学友的解释让我对内存有了更清晰的认识,毕竟内存很复杂,还需要再研究




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