Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的垃圾收集器是什么?_Java_Garbage Collection - Fatal编程技术网

Java中的垃圾收集器是什么?

Java中的垃圾收集器是什么?,java,garbage-collection,Java,Garbage Collection,我是Java新手,对Java中的垃圾收集器感到困惑。它实际上做什么,什么时候开始行动。请描述Java中垃圾收集器的一些属性。它释放分配给程序不再使用的对象的内存,因此命名为“垃圾”。例如: public static Object otherMethod(Object obj) { return new Object(); } public static void main(String[] args) { Object myObj = new Object(); my

我是Java新手,对Java中的垃圾收集器感到困惑。它实际上做什么,什么时候开始行动。请描述Java中垃圾收集器的一些属性。

它释放分配给程序不再使用的对象的内存,因此命名为“垃圾”。例如:

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()
之后,创建的原始
对象将变得不可访问-这就是垃圾收集的“垃圾”

在Java中,GC自动运行,但您也可以使用显式调用它,并尝试强制执行主要的垃圾收集。正如Pascal Thivent指出的,你真的不应该这样做,这可能弊大于利(参见)


有关更多信息,请参阅和(Oracle)上的wikipedia条目。

垃圾收集器意味着程序不再需要的对象是“垃圾”,可以扔掉。

垃圾收集器是JRE的一部分,它确保未引用的对象将从内存中释放。
它通常在应用程序内存不足时运行。 AFAIK它拥有一个表示对象之间链接的图形,可以释放孤立对象。
为了保存性能,将当前对象分为几代,每次GC扫描一个对象并发现它仍然被引用时,其生成计数会增加1(我认为是最大值,3或4),并首先扫描新的一代(内存中对象最短,就越可能不再需要它)因此,并非每次GC运行时都会扫描所有对象。
阅读了解更多信息。

剩下的只是机械装置

它通过检测何时不再可以从代码中访问内存块,并将这些内存块返回到空闲存储区来实现这一点


编辑:是的,链接是针对C#,但C#和Java在这方面是相同的。

Java(以及其他语言/平台)中的垃圾收集是Java运行时环境(JRE)重用不再需要的Java对象中的内存的一种方式。简单地说,当JRE最初启动时,它会向操作系统(O/S)请求一定量的内存。当JRE运行应用程序时,它会使用这些内存。当您的应用程序使用该内存时,JRE的“垃圾收集器”会出现并回收该内存,供现有应用程序的不同部分使用。JRE的“垃圾收集器”是一个后台任务,它总是在运行,并尝试在系统空闲时选择时间进行垃圾运行

一个现实世界的类比是垃圾工来到你家,捡起你的可回收垃圾。。。最终,您和/或其他人会以其他方式重新使用它。

是一个在上运行的程序,它将删除Java应用程序不再使用的对象。它是一种自动内存管理的形式

当一个典型的Java应用程序运行时,它正在创建新的对象,例如
String
s和
File
s,但是在一段时间之后,这些对象就不再使用了。例如,请查看以下代码:

for (File f : files) {
    String s = f.getName();
}
在上面的代码中,在
for
循环的每次迭代中都会创建
字符串s
。这意味着在每次迭代中,都会分配一点点内存来生成一个
字符串
对象

回到代码,我们可以看到,一旦执行了一次迭代,在下一次迭代中,在上一次迭代中创建的
String
对象将不再被使用——该对象现在被视为“垃圾”

最终,我们将开始得到大量的垃圾,内存将用于不再使用的对象。如果这种情况持续下去,Java虚拟机最终将耗尽空间来创建新对象

这就是垃圾收集器介入的地方

垃圾收集器将查找不再使用的对象,并将其清除,释放内存,以便其他新对象可以使用该内存

在Java中,内存管理由垃圾回收器负责,但在其他语言(如C)中,需要使用函数(如)自行执行内存管理。是那些容易出错的事情之一,这可能导致所谓的——当不再使用内存时,无法回收内存的地方


像垃圾收集这样的自动内存管理方案使程序员不必太担心内存管理问题,因此他或她可以更专注于开发他们需要开发的应用程序。

垃圾收集器可以看作是一个引用计数管理器。 如果创建了一个对象并将其引用存储在变量中,则其引用计数将增加1。在执行过程中,如果该变量赋值为NULL。该对象的引用计数将递减。因此,对象的当前引用计数为0。现在,当执行垃圾收集器时,它会检查引用计数为0的对象。并释放分配给它的资源

垃圾收集器调用由垃圾收集策略控制。

你可以在这里得到一些数据。

许多人认为垃圾收集会收集和丢弃死物。
实际上,Java垃圾收集的作用恰恰相反!活动对象被跟踪,其他所有对象被指定为垃圾

当一个对象不再使用时,垃圾收集器将回收底层内存,并将其重新用于将来的对象分配。这意味着没有显式删除,也没有内存返回给操作系统。 为了确定哪些对象不再使用,JVM间歇地运行一种非常合适的标记和扫描算法

检查此项以了解更多信息
int * array = new int[size];
processArray(array); //do some work.
delete array; //Free memory
public static void gc() {
    Runtime.getRuntime().gc();  
}
public native void gc();  // note native  method