java智能垃圾收集?
在Java中,只需调用System.gc()
就可以进行垃圾收集,但有时这会“暂停”应用程序。像这样收集垃圾并避开摊位是不是一个坏主意:
new Thread(new Runnable() {
public void run() {
System.gc();
}
}).start();
或者这会导致更多的问题吗
你可以在下面搜索框中键入要查询的问题!
在Java中,只需调用System.gc()
就可以进行垃圾收集,但有时这会“暂停”应用程序。像这样收集垃圾并避开摊位是不是一个坏主意:
new Thread(new Runnable() {
public void run() {
System.gc();
}
}).start();
或者这会导致更多的问题吗
# 1 楼答案
正如其他人所说,给
System.gc()
打电话通常是个错误。(并非总是。)假设您有一个调用
System.gc()
可能有益的罕见用例,有两种情况需要考虑:如果你的JVM使用的是一个经典的“停止世界”收集器,那么在一个单独的线程中运行它不会有什么区别。在此期间,GC停止所有应用程序线程
如果JVM运行的是并发收集器,那么在单独的线程中运行它可能是个好主意。的确,所有收集器都有一个停止所有线程的阶段,但调用
System.gc()
被记录为在“Java虚拟机已尽最大努力从所有丢弃的对象中回收空间”之后返回。因此,在单独的线程中运行它将允许当前线程执行其他操作。但是,您需要小心避免启动每个调用System.gc()
的多个线程;i、 e.负责启动线程的代码需要跟踪任何以前的GC线程# 2 楼答案
我无法击败@haylem answer的清晰和有力,抱歉。但让我补充一点,在Java中有很多(更好的)方法来管理内存。例如,有WeakReference和处理这些的集合,比如WeakHashMap。这些是处理内存的确定性方法,但根据javadoc,对GC的显式调用不是
# 3 楼答案
我完全同意,一般不建议明确地给垃圾收集器打电话。它可能会使应用程序暂停几秒钟,有时甚至几分钟。如果你正在处理后台服务,这通常不是问题,但如果它暴露给用户,他们会有一个糟糕的体验
然而,在某些极端情况下,您可能会想这样做:当内存非常不足,应用程序可能崩溃时。但是在应用程序的设计和实现方面可以做很多事情来避免这些情况
当涉及到回忆内存和避免内存泄漏时,我喜欢Java的一个特性是WeakReference对象。他们是你的朋友