这个问题是基于 This in Java第2版第109页中的 scope of object 一章,它说当我们使用创建一个对象时,它会在超出范围的时候挂起。它给出了这个例子:
{
String s = new String("a string");
} /* end of scope */
然后它会说,
引用的在作用域的末尾消失。但是,s所指向的String对象仍然占用内存。在这段代码中,无法访问对象,因为对它的唯一引用超出了作用域。
因此,如果我理解正确的话,文本"a string“仍然在内存中,但是具有第一个字符'a‘的内存地址的指针并不存在。这就是它的意思吗?
它接着说,
事实证明,因为用
创建的对象可以在你想要的时间内一直存在,所以在C++中,一大堆Java编程问题都会消失。
为什么这会是有利的?在上面的例子中,字符串数据继续驻留在内存中,没有办法访问它(因为指针在它超出范围后被销毁),这只会消耗资源。
发布于 2013-07-15 13:19:32
一旦Object
超出scope
,它将准备好进行垃圾收集,直到GC收集分离的对象,它将占用内存。
发布于 2013-07-15 13:30:41
简单地说,段中引用变量s
的作用域:
{
String s = new String("a string");
} /* end of scope */
在花括号之间。这意味着s
只存在于开始和结束{ }之间。然而,在该块中发生了一些事情。
在大括号内,调用new
操作符来创建String
对象的实例。将为对象分配内存,并将对该对象的引用分配给变量s
。
在代码块的末尾,s
不再存在,因此它持有的引用也不再存在。但是,String
对象仍然存在于内存中。但是,由于不再有任何变量保存对它的引用,因此程序的任何部分都不能再访问它。此时,该对象符合垃圾回收的条件。
在对象被垃圾回收之前,它仍然占据系统内存中的一席之地,即使程序不再能够访问它。
发布于 2013-07-15 13:29:57
翻到第215页,了解垃圾收集器是如何工作的。
在Java代码运行时,垃圾收集器会定期运行,以查找未被引用的所有对象,并释放它们所占用的内存。发生这种情况时,将在对象上调用finalize
方法(如果已定义)。此时,您可以执行对象所需的任何清理。
使用c++时,您必须担心使用delete
关键字自行释放内存-否则会导致内存泄漏。
使用Java,您可以用内存分配管理来换取托管对象生命周期管理。
https://stackoverflow.com/questions/17647194
复制相似问题