不明白java中对象的范围(java newbie confusion)

这个问题是基于JavaThinking of Object ,第2版,第109页 的对象范围,它说当我们使用new创建一个Java对象时,它会挂起来通过范围的结尾。 它给出了这个例子:

{ String s = new String("a string"); } /* end of scope */ 

然后它说,

参考文献在范围的最后消失了。 但是,s指向的String对象仍占用内存。 在这段代码中,无法访问对象,因为对它的唯一引用超出了范围。

因此,如果我理解正确,文本“a string”仍然存在于内存中,但是具有第一个字符“a”的内存地址的指针不存在。 这是什么意思?

它继续说,

事实certificate,因为使用new创建的对象只要你想要它们就会存在,所以在Java中,大量的C ++编程问题就会消失。

为什么这会有利? 在上面的例子中,字符串数据继续驻留在内存中,无法访问它(因为指针在超出范围后被销毁),这只占用了资源。

一旦Object超出scope并且它将为垃圾收集做好准备,直到GC收集分离的对象,将占用内存。

转到第215页,了解垃圾收集器的工作原理

在Java代码运行时, 垃圾收集器会定期运行以查找所有未引用的对象并释放它们占用的内存。 发生这种情况时,会在对象上调用finalize方法(如果已定义)。 那时你做对象所需的任何清理。

使用c ++,您必须担心使用delete关键字自己释放内存 – 如果不这样做可能会导致内存泄漏。

使用Java,您可以管理托管对象生命周期管理的内存分配。

简而言之,段中引用变量s的范围:

 { String s = new String("a string"); } /* end of scope */ 

在大括号之间。 这意味着s仅存在于开始和结束之间{}。 然而,在那个街区发生了一些事情。

在大括号内,调用new运算符以创建String对象的实例。 为对象分配内存,并为变量s分配对它的引用。

在代码块的末尾, s不再存在,因此它所持有的引用不再存在。 但是, String对象仍然存在于内存中。 但是由于不再有任何变量持有对它的引用,程序的任何部分都不再可以访问它。 此时,该对象有资格进行垃圾回收。

在对象被垃圾收集之前,它仍然占据系统内存中的一个位置,即使程序不再可以访问它。

它存在于内存中,直到Java垃圾收集器为您清理它。 它定期做什么。 这意味着您不必自己管理内存。

您可以创建对象,而无需担心分配和释放内存。

由于对象超出范围,因此将由垃圾收集器自动进行垃圾回收。 它比C ++更有利,因为在java中,Java Runtime会自动处理垃圾收集,因此最终将回收内存。 这不是C ++的情况

在Java中,一旦对对象的所有引用都被置零或超出范围,对象本身就成为垃圾收集器破坏的候选对象。 GC根据自己的算法自动执行此操作,而在C ++中,您必须显式地销毁对象。 此外,由于所谓的实习,字符串可能会继续存在。

我不明白这本书在讨论仍然占用内存的代码块时试图做出的观点。 也许它试图说的只是因为引用变量(如示例中的s )超出范围,并不意味着内存立即释放。 它没有说(至少在你发布的内容中)是这样的内存受到自动垃圾收集的影响,实际上,你应该编程好像将收集这样的孤立内存块一样。

与C ++相比,Java中垃圾收集的好处在于它都是自动完成的。 当内存分配的所有强引用(包括所有间接引用)超出范围时,该内存块将受到自动垃圾收集的约束。 简而言之就是这样。 Java正确处理循环引用之类的事情,并且垃圾收集任意复杂的数据结构,前提是结构不能直接或间接地从仍在范围内的任何引用值访问。

此外,由于实习 ,因此对字符串有特殊规则,因此该书的例子失败了。

事实certificate,因为使用new创建的对象只要你想要它们就会存在,所以在Java中,大量的C ++编程问题就会消失。 最困难的问题似乎发生在C ++中,因为在确保对象在需要时可用时,您无法从语言中获得任何帮助。 更重要的是,在C ++中,你必须确保在完成它们时销毁它们。

这提出了一个有趣的问题。 如果Java留下了周围的对象,是什么阻止它们填满内存并停止你的程序? 这正是C ++中可能出现的问题。 这是一些魔术发生的地方。 Java有一个垃圾收集器,它查看用new创建的所有对象,并找出哪些对象不再被引用。 然后它释放这些对象的内存,因此内存可以用于新对象。 这意味着您永远不必担心自己回收内存。 你只需要创建对象,当你不再需要它们时,它们就会自行消失。 这消除了某类编程问题:所谓的“内存泄漏”,程序员忘记释放内存。

意思是对象不是“躺在”它仍然在内存中等待被垃圾收集器收集。 想想这样。 你家里有很多物品,你想要摆脱它们中的一些并保留一些。 你有一个垃圾收集器来你的房子处理不需要的物品,但为了让他区分你想要保留的物品和你想要丢弃的物品,你要标记你想要他收集的物品。他到了。 这就是垃圾收集器的工作原理。 首先,它标记所有不需要的对象,然后立即收集它们。 垃圾收集器经常运行。