我的代码是:
class Test{
Test c=new Text();
System.out.println(c.size());
System.gc();
}
程序员可以System.gc()
在java中使用垃圾收集吗?它是可取的吗?JVM自动执行,那程序员为什么要调用System.gc()
呢?
我的代码是:
class Test{
Test c=new Text();
System.out.println(c.size());
System.gc();
}
程序员可以System.gc()
在java中使用垃圾收集吗?它是可取的吗?JVM自动执行,那程序员为什么要调用System.gc()
呢?
System.gc()
向 GC 发送请求以执行收集周期。该请求可能会被提供,也可能会被忽略,因此不应依赖任何结果。
垃圾回收周期将自动发生(您无需任何操作),通常是在负责分配新对象的一代已满或根本无法满足分配请求时。
在大多数情况下,您根本不需要System.gc()
在代码中调用。System.gc()
应在与以下类似条件适用的少数情况下使用:
你可以调用它。这样做不会有什么坏处。但是,您所期望的对象的内存是否会立即释放并没有保证。
更多 JVM 异步运行 GC,我们不需要驱动它。JVM
足够智能以释放内存。
只是为了了解目的是可以的,如果您真的考虑出于XYZ
某种原因清除内存,那么您的程序结构中肯定存在设计缺陷。
你可以调用它,但不保证内存会被释放。此外,如果内存被释放,这可能会对程序的执行产生负面影响。我会尽力向你解释,但我注意到你我的英语不是很好 XD
Java 堆内存根据对象生成分为三个区域。过于简单化:年轻人、成年人和老年人。当发生对 GC 的调用时,首先它会检查“年轻区”是否有未使用的对象并释放它们。如果 GC 没有在“年轻区”中释放足够多的内存,它会检查“成人区”。如果 GC 没有在“成人区”释放足够多的内存,它会检查“旧区”。GC 检查每一代的成本都比上一代高。
好吧,对象最初是在年轻区域中创建的,如果 GC 在年轻区域执行并且该对象仍在使用,则该对象将传递到成人区域。成人同上 -> 旧区。如果调用 GC 的执行,它可以认为年轻对象是成人对象的候选对象,并将其移动到成人区域。这会导致您的成人区域以不必要的方式增长。之后,当 GC 必须检查成人区时,操作对他来说成本更高,并且您的程序性能可能会下降。
即使你使用System.gc()
也不能保证内存会被释放
来自oracle站点 调用 gc 方法表明 Java 虚拟机花费精力回收未使用的对象,以使它们当前占用的内存可用于快速重用。当控制从方法调用返回时,Java 虚拟机已尽最大努力从所有丢弃的对象中回收空间。