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