【问题标题】:Delete unused variable's memory in java在java中删除未使用变量的内存
【发布时间】:2012-07-05 01:25:49
【问题描述】:

我知道 Java 有自己的垃圾收集器,但有时我想手动删除垃圾。有没有办法做这样的工作?考虑到我有一个很长或很长的function 声明了许多变量,在函数末尾使用而不是自动收集后立即删除未使用的内存是个好主意吗?如果我手动删除垃圾,是否会影响我的应用程序的速度?感谢您的帮助!

【问题讨论】:

  • 使用后将变量设置为null 是个好主意。 HotSpot 也会为您做到这一点,但不能 100% 保证。

标签: java memory-management


【解决方案1】:

在 java 中没有直接和直接的方法来释放内存。您可以尝试说服垃圾收集器使用众所周知的方法来带走一些对象:

Object obj = new Object();
// use obj
obj = null;
System.gc();

但不能保证这实际上会立即释放内存。

虽然这适用于堆内存,但堆栈分配的项目只能在函数返回时释放。

【讨论】:

  • 这里保证 GC 将尽最大努力立即做某事。 Javadoc:“当控制从方法调用返回时,Java 虚拟机已尽最大努力从所有丢弃的对象中回收空间。”只是不能保证到底会清理什么。
  • 对递归函数非常有用
【解决方案2】:

为什么要“手动”删除垃圾?如果是因为内存不足,请记住 Java 将在实际抛出 OutOfMemoryError 之前运行垃圾收集。如果你真的内存不足,那么即使你手动删除也没有垃圾。

声明变量不会在堆上分配内存。用new 制作一个对象就可以了。 JVM 甚至可以对没有超出范围但在方法结束之前不再使用的 GC 对象引用进行逃逸分析。

如果您的意思是您希望在系统资源不重要的某个时刻主动释放内存,那么请使用更好的 JVM 调优,例如使用并行 GC 算法。

通过将事物设置为 null 的“手动”垃圾收集可能会减慢速度,这仅仅是因为您付出了无意义地清空引用的成本,或者调用 GC 的次数超出了所需的次数。

【讨论】:

    【解决方案3】:

    您可以致电System.gc();,这可能会引导垃圾收集器进行清理。但可以肯定的是,这会影响您的应用程序的性能。一般来说,在这里尝试“优化”任何东西都是没有意义的。

    【讨论】:

      【解决方案4】:

      不值得手动执行此操作,因为垃圾收集器通常会做得更好,而自己执行此操作不太可能对您的应用程序产生明显影响。

      如果必须,可以将变量引用设置为null,并调用System.gc(),这将手动调用垃圾收集器。

      【讨论】:

        【解决方案5】:

        你可以给变量赋值null,验证这些对象没有任何引用,然后调用System.gc(),但这只是JVM调用GC的建议,但不能保证。垃圾收集 cal 会减慢您的应用程序直至冻结(stop-the-world GC)。

        【讨论】:

          【解决方案6】:

          一个非常常见的建议是使用System.gc() 哪个 JVM 可能会选择忽略。您还可以使用范围,例如:

          import java.io.*;
          public class AutoVariableTest
          {
              public static void main(String[] args) throws Exception
              {
                  String fileName = "test.txt";
                  {// This is local block just to keep auto variable in check
                      File file = new File(fileName); // file is not visible outside the scope and is available for garbage collection
                      BufferedReader br = null;
          
                      try{
                          br = new BufferedReader(new FileReader(file));
                          // ...
                      }finally{
                          if(br != null)
                              br.close();
                      }
                  }// local block end
              }
          }
          

          【讨论】:

            【解决方案7】:

            如果您打算在某个时间点之后减少使用的内存量,最好将数组用于变量,以便在不再需要时将数组设置为 null。这样一来,垃圾收集器清理所有数据所需的时间就会大大减少。

            【讨论】:

              【解决方案8】:

              如果你想管理内存,Java 不适合!或者如果你有很多时间,你可以在 JVM 中编写自己的垃圾回收机制

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2020-11-30
                • 2015-08-06
                • 2013-01-27
                • 1970-01-01
                • 2017-05-18
                • 1970-01-01
                • 2016-08-16
                相关资源
                最近更新 更多