什么是Java中的垃圾收集器?
什么是Java中的垃圾收集器?
我是Java的新手,对Java中的垃圾回收器感到困惑。它实际上是做什么的,什么时候会发挥作用。请描述一下Java垃圾收集器的一些属性。
垃圾回收(Garbage Collection)指的是释放程序不再使用的对象所占据的内存,因此得名“垃圾”。 例如:
public static Object otherMethod(Object obj) { return new Object(); } public static void main(String[] args) { Object myObj = new Object(); myObj = otherMethod(myObj); // ... more code ... }
我知道这个例子非常牵强,但是在这里,当您调用otherMethod()
后,原来创建的Object
将变得无法访问--这就是将要被垃圾回收收集的“垃圾”。
在Java中,GC是自动运行的,但是您也可以使用System.gc()
显式地调用它,试图强制进行主要的垃圾回收。正如Pascal Thivent所指出的,您确实不应该这样做,它可能带来更多的伤害而不是好处(请参见此问题)。
垃圾收集器是运行在Java虚拟机上的程序,它可以清除Java应用程序不再使用的对象。它是一种自动内存管理方式。
当一个典型的Java应用程序在运行时,它会创建新的对象,如字符串和文件,但是在一定时间后,这些对象不再被使用。例如,看一下以下代码:
for (File f : files) { String s = f.getName(); }
在上面的代码中,String s
在每个for
循环迭代中都被创建。这意味着在每次迭代中,都会分配一些内存来创建一个String
对象。
回到代码,我们可以看到一旦执行了单个迭代,在下一次迭代中,之前创建的String
对象将不再被使用--该对象现在被视为“垃圾”。
最终,我们将开始收到大量的垃圾,并且内存将用于不再使用的对象。如果这种情况持续下去,最终Java虚拟机将耗尽空间来创建新的对象。
这就是垃圾回收器发挥作用的地方。
垃圾收集器将查找不再使用的对象并将它们清除,释放内存,以便其他新对象可以使用该内存片段。
在Java中,内存管理由垃圾收集器负责,但在其他语言(如C)中,需要自己使用malloc
和free
等函数进行内存管理。内存管理是易错的事情之一,这可能导致所谓的内存泄漏--内存在不再使用时没有被回收的地方。
像垃圾收集这样的自动内存管理方案使程序员不必过多地担心内存管理问题,因此可以更多地关注他们需要开发的应用程序。