微科社区,轻松开发从此开始! 请登陆 免费注册

微科社区

当前位置:首页 > Java平台 > J2SE >

System.gc()是谁调用的?垃圾回收的范围是仅限当前

时间:2014-04-14 09:57  浏览:努力统计中...
调用System.gc(),垃圾回收器是不是执行了整个Java程序的垃圾回收还是只对当前类对象(调用System.gc()的类)进行回收? System.gc(); 是程序员手动调用的,这只是给jvm提个醒而已,告诉他该
调用System.gc(),垃圾回收器是不是执行了整个Java程序的垃圾回收还是只对当前类对象(调用System.gc()的类)进行回收?

System.gc();

是程序员手动调用的,这只是给jvm提个醒而已,告诉他该回收垃圾了,但是jvm什么时候真的去回收垃圾,我们就没有办法控制了。

该回复于2014-04-07 12:16:42被版主删除




正解,在JVM里面GC是一条优先级非常低的thread,调用时机一般是在heap要快满了或者当前java进程闲的蛋疼的时候,但可以调整GC的频率

楼上正解,有一些性能分析器,可以监测jvm的变化,可以看到当程序内存扩展到一定程度,GC启动回收同时会扩展一些预留内存







正解,在JVM里面GC是一条优先级非常低的thread,调用时机一般是在heap要快满了或者当前java进程闲的蛋疼的时候,但可以调整GC的频率
我是问System.gc()是不是当前对象调用的?并且只对当前对象执行垃圾回收。
public class A {
public static void main(String[] args)  {
new A();
                new A ();
System.gc();
}

}

执行了System.gc();后系统是不是只进行A对象的回收?影响不到别的类对象吗?哪怕有另外的java类对象(比如有个B类的对象也在运行)已经成为垃圾。

发送回收请求,自然是整个程序,它是一个类的方法,无法知道当前对象.

gc 只能清除在堆上分配的内存(纯java语言的所有对象都在堆上使用new分配内存),而不能清除栈上分配的内存(当使用JNI技术时,可能会在栈上分配内存,例如java调用c程序,而该c程序使用malloc分配内存时).因此,如果某些对象被分配了栈上的内存区域,那gc就管不着了,对这样的对象进行内存回收就要靠finalize().

提示JVM,准备回收不需要的内存,至于何时回收,只有JVM调度清楚。不是我们想回收即可就回收的。

haoba,深入理解JVM







正解,在JVM里面GC是一条优先级非常低的thread,调用时机一般是在heap要快满了或者当前java进程闲的蛋疼的时候,但可以调整GC的频率
我是问System.gc()是不是当前对象调用的?并且只对当前对象执行垃圾回收。
public class A {
public static void main(String[] args)  {
new A();
                new A ();
System.gc();
}

}

执行了System.gc();后系统是不是只进行A对象的回收?影响不到别的类对象吗?哪怕有另外的java类对象(比如有个B类的对象也在运行)已经成为垃圾。[/quote
不是回收某个对象,而是回收系统中用不到的对象,而且虽然调用System.gc()之后,但是并不代表立即执行,而是当某个不确定的时候才执行,如果要让某个对象被回收掉,可以将这个对象置为null,如 A a = null,这样GC就会去回收a,但是具体在什么时候执行就不知道了

什么时候执行不确定,告诉虚拟机尽最大努力回收垃圾


a只是个引用变量而已,回收的应该是new出来的对象吧

应该是整个程序的闲置对象吧??!!


一楼正解
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%
    ------分隔线------