为什么Java System.gc()没有按预期工作?

Vas*_*ant 3 java garbage-collection memory-management

我有两个函数,一个是insert(),另一个是startGC().

我将首先调用insert()方法,这将占用大约300MB的堆空间.之后,我将调用startGC(),它应释放在堆中分配的内存,因为所有向量对象都是函数的本地对象,但它没有发生.

private void insert()
 {
         Vector v=new Vector();
         Vector v1=new Vector();
         Vector v2=new Vector();
        String str="Hello";

        for (long i = 0L; i < 999999L; i++) {
            v.add(str + i);
            v1.add(str + i);
            v2.add(str + i);
        }
        v=null;
        v1=null;
        v2=null;
 }

private void startGC()
{
    System.gc();
}
Run Code Online (Sandbox Code Playgroud)

我的问题:

1)为什么垃圾收集在这个例子中不起作用.

2)如何使JVM垃圾收集所有未使用的内存块.

任何代码示例都实现相同.

Kep*_*pil 7

  1. 它以什么方式工作?
  2. 您不能告诉 JVM启动垃圾收集,您只能通过调用System.gc()来建议您认为这是一个好主意.

来自JavaDoc:

调用gc方法表明Java虚拟机花费了大量精力来回收未使用的对象,以使其当前占用的内存可用于快速重用.当控制从方法调用返回时,Java虚拟机已尽最大努力从所有丢弃的对象中回收空间.