... 获取一些内存并丢失指向该内存的所有指针,以便System.gc();可以收集它。
调用System.gc();
执行其他任务;
"执行其他任务;"和"调用System.gc();"是并行工作还是"执行其他任务;"等待"调用System.gc();"被执行?
谢谢。
... 获取一些内存并丢失指向该内存的所有指针,以便System.gc();可以收集它。
调用System.gc();
执行其他任务;
"执行其他任务;"和"调用System.gc();"是并行工作还是"执行其他任务;"等待"调用System.gc();"被执行?
谢谢。
通常情况下,它是同步的,但不保证。
实际上,并不保证集合会有效地发生,因为JVM将决定是否有意义以及使用何种垃圾收集方式。
如果您需要更多信息,可以使用-verbosegc
标志启动程序。
无论如何,垃圾回收都是由JVM自动发起的,没有任何指定的调用,调用System.gc()
只是一种提示,让它知道它可能开始进行收集。
正如Eric Eijkelenboom所指出的那样,调用此方法并不意味着垃圾回收器会立即执行。实际上,你不知道它是否会被调用...
根据你对Amarghosh答案的评论,你需要在执行需要大量RAM的操作之前释放一些内存,是吗?在这种情况下,你不需要担心。如果有足够的内存可以进行垃圾回收,当你尝试分配它时,它将自动完成。
“做一些其他任务”等待System.gc()
执行并返回。
无法确定。调用System.gc()
并不意味着垃圾回收会在那一秒钟内执行,而只是被安排了。由JVM来决定在适当的时间执行垃圾回收。
System.gc()
的API文档中可以得知:"当方法调用返回时,Java虚拟机已经尽最大努力回收所有废弃对象所占用的空间。" - Matthew T. Staeblerjavadoc 告诉 http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#gc() : "当方法调用返回控制权时,Java虚拟机已经尽最大努力从所有废弃对象中回收空间。"
所以我认为 "do some other tasks;" 等待执行 "System.gc();"!
没有使用并行处理 - 这对于Java应用程序来说不好。事实上,调用/强制垃圾回收器从来都不是一个好主意。它必须保留给极端情况下没有其他解决方案的情况...
再见, 阿尔班。
System.gc()
的线程会被停止直到GC完成其操作。请注意这只是一个提示,JVM可以自由忽略它,而Sun的JVM实际上有一个命令行选项(-XX:-DisableExplicitGC
)以此为例。使用此开关,System.gc()
将无效并立即返回。System.gc()
的净效果在大多数情况下是降低性能。如果您觉得必须调用该方法,则很可能是在做某些错误的事情。