0

这是代码片段。

method(){
    String s1="abc";
    String s2 = new String ("abc");
    s1=null;
    s2=null;
    --------
    ---------
     }

最后是s1 & s2对象存在吗?你将如何确保这些对象被垃圾回收?

4

5 回答 5

1

对象引用s1s2资格进行一次垃圾回收s1=nulls2=null前提是不存在对该对象的其他引用或method退出时,前提是对象仅由局部变量引用。对象一旦创建就会使用一些内存并且内存保持分配状态直到有对象使用的引用。当对象没有引用时,假定不再需要,可以回收对象*占用的内存。*如果一个对象无法从任何活动线程或任何静态引用中访问,则该对象有资格进行垃圾收集或 GC,换句话说,如果一个对象的所有引用都为空,则可以说该对象有资格进行垃圾收集。

有诸如System.gc()Runtime.gc()之类的方法用于将垃圾收集请求发送到 JVM ,但不能保证垃圾收集会发生。 Java 程序员不能在 Java 中强制垃圾回收;它只会在 JVM 认为它需要垃圾收集时触发。强制 GC 是编码错误的标志。反过来,应该始终尽量减少不必要对象的创建和对这些对象的引用。

于 2013-05-08T16:58:02.963 回答
0

垃圾收集器定期运行(时间段取决于 JVM)。当引用被破坏时(可能通过将 null 分配给引用)Java 维护对象表及其引用,然后在下次执行 GC(垃圾收集器)时,将删除没有引用的对象(如果 GC 出现问题,则不会对对象进行垃圾收集- 非常非常罕见的情况),这完全取决于 JVM。您可以使用以下代码向 JVM 发送请求以运行 GC(处理您的请求再次取决于 JVM):

Runtime.getRuntime().gc();

或者

System.gc();

程序员不必担心正在运行的 GC,主要是 JVM 会处理 GC 的执行。对垃圾收集器进行了许多增强。Java(最新版本)带有 G1(Garbage First)收集器,它是一种运行更有效的服务器式垃圾收集器。G1 是 CMS(并发标记扫描收集器)的绝佳替代品。如果您想了解更多关于垃圾收集器的信息,那么您应该阅读以下页面:

[http://docs.oracle.com/javase/7/docs/technotes/guides/vm/gc-ergonomics.html][1] [http://docs.oracle.com/javase/7/docs/technotes /guides/vm/cms-6.html][2] [http://docs.oracle.com/javase/7/docs/technotes/guides/vm/par-compaction-6.html][3]

于 2013-05-08T17:20:36.970 回答
0

如果问题是如何确定,答案相当简单。您永远无法确保任何对象都会被垃圾回收。 阅读本文以了解垃圾收集的真正含义以及如何对其进行推理。

如果问题是如何提示集合,则将不需要的对象的所有引用设置为null并调用System.gc(),这将请求(而不是强制)集合。使用此方法无法保证发布任何内容,但通常它是您可以获得的最接近的内容。

如果您想专门为 strings执行此操作,因为它们可能包含敏感数据或类似的内容,请使用 achar[]而不是 a 来存储该数据String,因为您可以随意更改数组的原始值并在您删除它们时删除它们重做。

于 2013-05-08T17:01:14.810 回答
0

他们超出范围后会被垃圾收集。

除非您实际上遇到了严重的性能问题,否则我将不再担心它,而让垃圾收集器来做这件事。


不过你应该小心,有一些元素,如文件流、打开的套接字等,不是这样管理的。你必须关闭那些。

于 2013-05-08T16:59:24.257 回答
0

字符串 s2 = 新字符串 ("abc"); 这里'abc' 将在常规的、可垃圾收集的堆区域中创建。因此,只要将 S2 设为 null,此字符串对象就可以进行垃圾回收。这是假设您的程序没有对此特定字符串对象“abc”的任何其他引用。

字符串 s1="abc"; 在这种情况下,“abc”将在堆的特殊区域中创建,称为文字池或字符串池。将 "abc" 设为 null 不会使 "abc" 有资格进行垃圾回收,因为 JVM 将来会尝试重用此 "abc"。在这种情况下的基线是,正常的垃圾收集规则不会在这里应用。

希望这有帮助。:-)

于 2013-10-09T06:01:50.477 回答