如何清理这个Java示例内存

时间:2015-04-08 22:06:55

标签: java memory garbage-collection finalize

我正在阅读Java中的垃圾收集和定稿,当我尝试一个例子时。我点击按钮1,内存跳了起来。但是当我点击按钮2时,内存并没有释放已用空间! 我做错了什么以及如何从未使用的对象中释放内存?

据我所知(我可能错了):

  1. 当一次又一次地重新实例化同一个变量时,旧对象将被销毁。
  2. 当我将变量设置为null时,旧对象将被销毁。
  3. 数组单元格为空值。当父数组对象没有引用它的变量时,它们将被销毁。
  4. 如何释放收藏品?数组规则如何应用?
  5. 代码:

    public class Memory extends javax.swing.JFrame {
    
        Object[] object;
    
        private void Button1ActionPerformed(java.awt.event.ActionEvent evt) {
            object = new Object[10240000];
        }
    
        private void Button2ActionPerformed(java.awt.event.ActionEvent evt) {
            object = null;
    
            System.gc();
            System.runFinalization();
    
            //OR
    
            System.runFinalization();
            System.gc();
        }
    }
    

2 个答案:

答案 0 :(得分:1)

System.gc()仅是JVM清理内存的建议。它可能会也可能不会采纳这个建议。你没有做错任何事。放松。

答案 1 :(得分:0)

Java将最终清除未使用的对象,这就是垃圾收集器的用途。您不必担心它或为其编写任何代码。

GC定期使用Java并且它不是即时的,System.gc()只建议GC应该运行,这可能不会发生。

如果你想看看java GC的运行情况,你应该尝试一个运行时间更长的程序,看看内存和GC的运行情况。

  1. 当相同的变量被重新启动时,旧对象将被销毁。

  2. 将变量设置为null时,旧对象将被销毁

  3. 当父数组对象没有引用它的变量时,数组单元格是空值,它们将被销毁

  4. 如何释放集合或数组规则?

  5. 对所有四点的回答是:垃圾收集器会处理这个问题。

    即使垃圾收集器可能运行,内存仍然很高的原因是JVM占用的内存不仅仅是对象。