日期:2014-05-20  浏览次数:20686 次

System.gc()是谁调用的?垃圾回收的范围是仅限当前java程序吗?
调用System.gc(),垃圾回收器是不是执行了整个Java程序的垃圾回收还是只对当前类对象(调用System.gc()的类)进行回收?
------解决方案--------------------
System.gc();

是程序员手动调用的,这只是给jvm提个醒而已,告诉他该回收垃圾了,但是jvm什么时候真的去回收垃圾,我们就没有办法控制了。
------解决方案--------------------
引用:
System.gc();

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


正解,在JVM里面GC是一条优先级非常低的thread,调用时机一般是在heap要快满了或者当前java进程闲的蛋疼的时候,但可以调整GC的频率
------解决方案--------------------
楼上正解,有一些性能分析器,可以监测jvm的变化,可以看到当程序内存扩展到一定程度,GC启动回收同时会扩展一些预留内存
------解决方案--------------------
发送回收请求,自然是整个程序,它是一个类的方法,无法知道当前对象.
------解决方案--------------------
gc 只能清除在堆上分配的内存(纯java语言的所有对象都在堆上使用new分配内存),而不能清除栈上分配的内存(当使用JNI技术时,可能会在栈上分配内存,例如java调用c程序,而该c程序使用malloc分配内存时).因此,如果某些对象被分配了栈上的内存区域,那gc就管不着了,对这样的对象进行内存回收就要靠finalize().
------解决方案--------------------
提示JVM,准备回收不需要的内存,至于何时回收,只有JVM调度清楚。不是我们想回收即可就回收的。
------解决方案--------------------
引用:
Quote: 引用:

调用System.gc(),垃圾回收器是不是执行了整个Java程序的垃圾回收还是只对当前类对象(调用System.gc()的类)进行回收?


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


引用:
Quote: 引用:

System.gc();

是程序员手动调用的,这只是给jvm提个醒而已,告诉他该回收垃圾了,但是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,但是具体在什么时候执行就不知道了
------解决方案--------------------
应该是整个程序的闲置对象吧??!!