有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java智能垃圾收集?

在Java中,只需调用System.gc()就可以进行垃圾收集,但有时这会“暂停”应用程序。像这样收集垃圾并避开摊位是不是一个坏主意:

new Thread(new Runnable() {
   public void run() { 
      System.gc(); 
   }
}).start();

或者这会导致更多的问题吗


共 (3) 个答案

  1. # 1 楼答案

    正如其他人所说,给System.gc()打电话通常是个错误。(并非总是。)

    假设您有一个调用System.gc()可能有益的罕见用例,有两种情况需要考虑:

    • 如果你的JVM使用的是一个经典的“停止世界”收集器,那么在一个单独的线程中运行它不会有什么区别。在此期间,GC停止所有应用程序线程

    • 如果JVM运行的是并发收集器,那么在单独的线程中运行它可能是个好主意。的确,所有收集器都有一个停止所有线程的阶段,但调用System.gc()被记录为在“Java虚拟机已尽最大努力从所有丢弃的对象中回收空间”之后返回。因此,在单独的线程中运行它将允许当前线程执行其他操作。但是,您需要小心避免启动每个调用System.gc()的多个线程;i、 e.负责启动线程的代码需要跟踪任何以前的GC线程

  2. # 2 楼答案

    我无法击败@haylem answer的清晰和有力,抱歉。但让我补充一点,在Java中有很多(更好的)方法来管理内存。例如,有WeakReference和处理这些的集合,比如WeakHashMap。这些是处理内存的确定性方法,但根据javadoc,对GC的显式调用不是

    Calling the gc method suggests that the Java Virtual Machine expend effort toward 
    recycling unused objects in order to make the memory they currently occupy available 
    for quick reuse. When control returns from the method call, the Java Virtual Machine 
    has made a best effort to reclaim space from all discarded objects.
    
  3. # 3 楼答案

    我完全同意,一般不建议明确地给垃圾收集器打电话。它可能会使应用程序暂停几秒钟,有时甚至几分钟。如果你正在处理后台服务,这通常不是问题,但如果它暴露给用户,他们会有一个糟糕的体验

    然而,在某些极端情况下,您可能会想这样做:当内存非常不足,应用程序可能崩溃时。但是在应用程序的设计和实现方面可以做很多事情来避免这些情况

    当涉及到回忆内存和避免内存泄漏时,我喜欢Java的一个特性是WeakReference对象。他们是你的朋友