Java GC何时开始收集垃圾?

Java GC何时开始收集垃圾?,java,memory-management,memory-leaks,Java,Memory Management,Memory Leaks,我对垃圾收集器很幼稚。如果堆在当前方法执行期间内存不足,垃圾收集器是否会等待方法退出?或者它可以在里程碑1(换句话说,在当前方法执行的中间)开始,并释放关键字占用的空间(换句话说,当前方法的局部变量占用的空间)。p> public void myMethod(){ //里程碑1 列表关键字=callSomeFunction(); 关键词=null; . . . . //里程碑2 . . . //里程碑3-从这里退出 } Java垃圾收集器在后台运行,基本上可以随时启动。它更有可能在程序请求新内存

我对垃圾收集器很幼稚。如果堆在当前方法执行期间内存不足,垃圾收集器是否会等待方法退出?或者它可以在里程碑1(换句话说,在当前方法执行的中间)开始,并释放关键字占用的空间(换句话说,当前方法的局部变量占用的空间)。p>
public void myMethod(){
//里程碑1
列表关键字=callSomeFunction();
关键词=null;
.
.
.
.
//里程碑2
.
.
.
//里程碑3-从这里退出
}

Java垃圾收集器在后台运行,基本上可以随时启动。它更有可能在程序请求新内存时运行,但没有确定的方法知道GC何时运行。

Java垃圾收集器在后台运行,基本上可以随时启动。它更有可能在程序请求新内存时运行,但无法确定GC何时运行。

JVM向代码中添加保存点,以便在执行GC之前将所有线程带到安全点。这些保存点可以发生在任何字节码指令之间,但JVM通常会优化这些保存点以减少开销


GC可以在内存不足时触发(CMS就是这样),但是次要收集和并行收集只有在内存不足或直接触发时才会运行。

JVM将保存点添加到代码中,以便在执行GC之前将所有线程带到安全点。这些保存点可以发生在任何字节码指令之间,但JVM通常会优化这些保存点以减少开销


GC可以在内存不足时触发(如CMS),但是次要收集和并行收集仅在内存不足或直接触发时才会运行。

简短回答:垃圾收集器永远不会收集当前正在使用的空间。因此,在您的示例中,只要
关键字
在范围内,就不会收集它引用的任何内容。但是当您将其指定为null时,如果没有其他人引用它们,则它用来引用的对象可能符合收集条件。这并不意味着那些对象将被收集,只是可能发生

答案很长: 首先,您必须了解Java虚拟机有多种实现。Java8虚拟机规范中甚至不要求JVM进行垃圾收集

也就是说,垃圾收集是JVM中的一个常见特性。Java语言规范8在第1章中规定:

Java编程语言。。。包括自动存储 管理,通常使用垃圾收集器,以避免安全问题 显式释放的问题(如C的free或C++的delete)

JavadocforJava8将
System.gc()
方法记录如下:

运行垃圾收集器

调用gc方法意味着Java虚拟机需要 努力回收未使用的对象,以使内存 它们目前可用于快速重用。当控件返回时 从方法调用来看,Java虚拟机已经尽了最大的努力 从所有丢弃的对象中回收空间

然后它接着说
System.gc()
相当于
Runtime.getRuntime().gc()
。该方法的JavaDoc说明:

运行垃圾收集器。调用此方法表明Java 虚拟机将精力花在按顺序回收未使用的对象上 使它们当前占用的内存可供快速重用。 当控件从方法调用返回时,虚拟机 尽最大努力回收所有废弃物品

gc的名称代表“垃圾收集器”。虚拟机 根据需要,以单独的方式自动执行此回收过程 线程,即使没有显式调用gc方法

下面是一些外卖:

  • 规范不要求垃圾收集
  • 无论如何,这是JVM的一个常见部分
  • 您无法真正控制它,只能“建议”JVM进行一些垃圾收集
  • 垃圾收集通常发生在它自己的线程中,只要JVM希望它发生,所以它是完全不可预测的

  • 简短的回答是:垃圾收集器永远不会收集当前正在使用的空间。因此,在您的示例中,只要
    关键字
    在范围内,就不会收集它引用的任何内容。但是当您将其指定为null时,如果没有其他人引用它们,则它用来引用的对象可能符合收集条件。这并不意味着那些对象将被收集,只是可能发生

    答案很长: 首先,您必须了解Java虚拟机有多种实现。Java8虚拟机规范中甚至不要求JVM进行垃圾收集

    也就是说,垃圾收集是JVM中的一个常见特性。Java语言规范8在第1章中规定:

    Java编程语言。。。包括自动存储 管理,通常使用垃圾收集器,以避免安全问题 显式释放的问题(如C的free或C++的delete)

    JavadocforJava8将
    System.gc()
    方法记录如下:

    运行垃圾收集器

    调用gc方法意味着Java虚拟机需要 努力回收未使用的对象,以使内存 它们目前可用于快速重用。当控件返回时 从方法调用来看,Java虚拟机已经尽了最大的努力 回收空间f
    public void myMethod() {
    
    //Milestone 1
     List<Keyword> keywords = callSomeFunction();
     keywords = null;
     .
     .
     .
     .
     //Milestone 2
    
      .
      .
      .
    
    // Milestone 3 - Exit here 
    
    }