Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.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 垃圾收集的System.gc()_Java - Fatal编程技术网

Java 垃圾收集的System.gc()

Java 垃圾收集的System.gc(),java,Java,我的代码是: class Test{ Test c=new Text(); System.out.println(c.size()); System.gc(); } 程序员可以在java中使用System.gc进行垃圾收集吗?它更可取吗?JVM会自动执行,那么为什么程序员要调用System.gc?即使使用System.gc也不能保证内存会被释放 从网站 调用gc方法意味着Java虚拟机将精力花在回收未使用的对象上,以使它们当前占用的内存可用于快速重用。当控件从方法调用返

我的代码是:

class Test{
    Test c=new Text();
    System.out.println(c.size());
    System.gc();
}
程序员可以在java中使用System.gc进行垃圾收集吗?它更可取吗?JVM会自动执行,那么为什么程序员要调用System.gc?

即使使用System.gc也不能保证内存会被释放

从网站
调用gc方法意味着Java虚拟机将精力花在回收未使用的对象上,以使它们当前占用的内存可用于快速重用。当控件从方法调用返回时,Java虚拟机已尽最大努力从所有丢弃的对象中回收空间。

您可以调用它。这不会有什么害处。但并没有一个高伦蒂能让你所期待的对象的记忆立即得到释放

更多JVM异步运行GC,我们不需要驱动它。JVM足够智能,可以释放内存

仅为了了解目的,如果您确实考虑由于XYZ原因清除内存,那么肯定是程序结构中存在设计缺陷。

System.gc向gc发送请求以执行收集循环。此请求可能会被送达,也可能会被忽略,因此不应依赖任何结果

垃圾收集周期将自动发生,而您无需执行任何操作,通常是在负责分配新对象的生成已满或分配请求根本无法满足时

在大多数情况下,您根本不需要在代码中调用System.gc。System.gc应在以下类似条件适用的少数情况下使用:

你知道,大量的内存刚刚变得无法访问。 快速释放这一数量的内存是至关重要的。 或者,您的程序即将进入一个时间关键状态,在此状态下,GC循环应该尽可能晚或根本不发生,因此在您进入该状态之前执行GC循环是有帮助的。 您至少大致了解了目标环境的GC是如何工作的。 您已经验证了该GC的策略在当时并不适合您的场景。
您可以调用它,但不能保证内存会被释放。此外,如果内存被释放,这可能会对程序的执行产生负面影响。我会尽力向你解释,但我注意到你我的英语不是很好

Java堆内存根据对象生成分为三个区域。过于简单化:年轻人、成年人和老年人。当发生对GC的调用时,它要做的第一件事是检查年轻区域中未使用的对象并释放它们。如果GC不能释放年轻区域中足够的内存,它会检查成人区域。如果GC没有释放成人区域中足够的内存,它将检查旧区域。每一代的GC检查成本都比上一代高


对象最初是在青年区创建的,如果GC在青年区执行一个执行,并且对象仍然被使用,那么该对象将传递给成人区。成人标识->旧区域。如果调用GC的执行,它会认为年轻对象是成人对象的候选对象,并将其移动到成人区域。这会导致你的成人区以不必要的方式增长。后来,当GC必须检查成人区时,操作对他来说成本更高,并且您的程序性能可能会下降。

基本上,调用它的唯一原因是为了简化一点调试,避免内存泄漏,而且它仍然不能保证完整gc的时间,所以不能依赖它。那么我们如何释放内存呢?@Pinky你可以像字符串x一样将其引用为null=null@javaBeginner坏主意。您应该设计得更好,这样就不必将引用设置为null。@Theodoros Chatzigiannakis证明您的设计是正确的comment@Pinky将局部变量设置为null没有效果,但它们很快就会无效。将字段设置为null会产生效果,但很有可能使对象状态无效,这是一种非常糟糕的做法,因为它会损害程序的完整性。感谢您的解释。它的useful@Pinky我希望你也能从中了解到,在几乎所有的情况下,你都不应该称之为它,除非你真的知道自己在做什么。我希望这对年轻人有帮助。从技术上来说,这些区域是年轻的、老的和永久的,也就是永久性的。PermGen的原因是系统级内存类定义很少可用于收集。Angel me gusta tu foto,拥有quedado clavado!:D