以下是代码段。
method(){
String s1="abc";
String s2 = new String ("abc");
s1=null;
s2=null;
--------
---------
}
最后是s1 & s2
个对象存在吗?你如何确保这些对象被垃圾收集?
答案 0 :(得分:1)
s1
和s2
引用的对象符合垃圾回收条件 s1=null
和s2=null
前提是没有其他对该对象的引用存在或当method
退出时,前提是对象仅由局部变量引用。一旦创建的对象使用一些内存并且内存保持分配,直到有对象的使用参考。当没有时对象的引用,假定不再需要,并且可以回收对象* 占用的内存。 *如果从任何活动线程无法访问对象,则该对象符合垃圾收集或GC的条件或者任何静态引用,换句话说,如果一个对象的所有引用都为null,则可以说该对象有资格进行垃圾收集。
有System.gc()和Runtime.gc()等方法用于将垃圾收集请求发送到JVM ,但不能保证垃圾收集会发生。 Java程序员不能强迫Java中的垃圾收集;它只会在JVM认为需要垃圾回收的情况下触发。强制GC是编码错误的标志。反过来总是应该尽量减少不必要的对象的创建和对这些对象的引用。
答案 1 :(得分:0)
他们离开范围后收集垃圾。
除非你真的遇到严重的性能问题,否则我会不再那么担心,让垃圾收集器做到这一点。
你应该小心,但有一些元素,如文件流,开放套接字等,不是那样管理的。你必须关闭那些。
答案 2 :(得分:0)
如果问题是如何确保,答案很简单。 你永远无法确保任何对象都被垃圾收集。 Read this了解垃圾收集的真正含义以及如何推理它。
如果问题是如何提示集合,那么将不需要的对象的所有引用设置为null
并调用System.gc()
,这将请求(而非强制)一个集合。使用这种方法无法保证释放任何东西,但通常它是你能得到的最接近的东西。
如果您想要专门针对字符串,因为它们可能包含敏感数据或其他内容,请使用char[]
来存储该数据而不是{{1}因为你可以随意改变数组的原始值,并在你完成后删除它们。
答案 3 :(得分:0)
垃圾收集器定期运行(时间段取决于JVM)。 Java在引用被破坏时维护对象及其引用的表(可能通过将null赋值给引用)然后在下一次执行GC(垃圾收集器)时没有引用的对象将被删除(如果GC出现问题则对象不会被垃圾收集 - 非常非常罕见的情况),完全依赖于JVM。您可以使用以下代码向JVM发送请求以运行GC(处理您的请求再次依赖于JVM):
Runtime.getRuntime().gc();
或
System.gc();
程序员不必担心运行GC,主要是JVM会处理GC的执行。垃圾收集器有很多增强功能。 Java(最新版本)附带G1(Garbage First)收集器,它是一种服务器式垃圾收集器,可以更有效地运行。 G1是CMS(Concurrent Mark-Sweep Collector)的绝佳替代品。 如果您想了解有关垃圾收集器的更多信息,那么您应该阅读以下页面:
[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]
答案 4 :(得分:0)
String s2 = new String(“abc”); 这里'abc'将在常规的垃圾收集堆区域中创建。 因此,只要使S2为null,此字符串对象就有资格进行垃圾回收。 这假设您的程序没有对此特定字符串对象“abc”的任何其他引用。
String s1 =“abc”; 在这种情况下,将在堆的特殊区域(称为文字池或字符串池)中创建“abc”。使“abc”为null不会使“abc”符合垃圾回收的条件,因为JVM将来会尝试重用这个“abc”。 在这种情况下的基线是,正常的垃圾收集规则将不适用于此。
希望这有帮助。 : - )