我知道 Java 有自己的垃圾收集器,但有时我想手动删除垃圾。有没有办法做这样的工作?考虑到我有一个很长或很长function
的声明了许多变量,在函数结束时使用而不是自动收集后立即删除未使用的内存是个好主意吗?如果我手动删除垃圾,是否会影响我的应用程序的速度?感谢您的帮助!
8 回答
在 java 中没有直接和直接的方法来释放内存。您可能会尝试使用众所周知的方法说服垃圾收集器带走一些对象:
Object obj = new Object();
// use obj
obj = null;
System.gc();
但不能保证这实际上会立即释放内存。
虽然这适用于堆内存,但堆栈分配的项目只能在函数返回时释放。
为什么要“手动”删除垃圾?如果是因为内存不足,请记住 Java 将在实际抛出OutOfMemoryError
. 如果你真的内存不足,那么即使你手动删除也没有垃圾。
声明变量不会在堆上分配内存。用 do 制作一个对象new
。JVM 甚至可以对没有超出范围但在方法结束之前不再使用的 GC 对象引用进行逃逸分析。
如果您的意思是您希望在系统资源不重要的某个时刻主动释放内存,那么请使用更好的 JVM 调优,例如使用并行 GC 算法。
“手动”垃圾收集通过将事物设置为null
可能会减慢速度,这仅仅是因为您付出了无意义地清空引用的成本,或者调用 GC 的次数超过了所需的次数。
您可以调用System.gc();
which可能会导致垃圾收集器进行清理。但可以肯定的是,这会影响您的应用程序的性能。一般来说,在这里尝试“优化”任何东西都是没有意义的。
手动执行此操作不值得,因为垃圾收集器通常会做得更好,而您自己执行此操作不太可能对您的应用程序产生明显影响。
如果必须,可以将变量引用设置为 null,然后调用System.gc()
,这将手动调用垃圾收集器。
您可以将 null 分配给变量,验证没有对这些对象的任何引用并调用 System.gc(),但这只是 JVM 调用 GC 的建议,但不能保证。垃圾收集 cal 会减慢您的应用程序直至冻结(stop-the-world GC)。
一个非常常见的建议是使用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
}
}
如果您打算在某个时间点之后减少使用的内存量,最好将数组用于变量,以便在不再需要时将数组设置为 null。这样,垃圾收集器清理所有数据所需的时间要少得多。
如果您尝试管理内存,Java 不适合!或者如果你有很多时间,你可以在 JVM 中编写自己的垃圾收集机制