我知道Java有自己的垃圾收集,但有时我想手动删除垃圾。有什么办法可以完成这样的工作吗?考虑到我有一个很长或很长的
function
,它声明了许多变量,在使用后立即删除未使用的内存而不是在函数末尾自动收集是一个好主意吗?如果我手动删除垃圾,会影响我的应用程序的速度吗?感谢您的帮助!
java中没有直接立即释放内存的方法。您可能会尝试使用众所周知的方法说服垃圾收集器拿走某些对象:
Object obj = new Object();
// use obj
obj = null;
System.gc();
但不能保证这实际上会立即释放内存。
虽然这适用于堆内存,但堆栈分配的项目只能在函数返回时释放。
OutOfMemoryError
之前运行垃圾收集。而如果你真的内存不足,那么即使你手动删除也没有垃圾。声明变量不会在堆上分配内存。用
new
制作一个物体就可以了。 JVM 甚至可以对尚未超出范围但在方法结束之前不再使用的 GC 对象引用进行逃逸分析。如果您的意思是您想要在系统资源不重要的某个点主动释放内存,那么请使用更好的 JVM 调整,例如使用并行 GC 算法。
通过将事物设置为
null
来“手动”垃圾收集可能会减慢速度,如果只是因为您毫无意义地付出了清空引用的成本,或者调用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。这样,垃圾收集器清理所有数据所需的时间就会少得多。您可以将 null 分配给变量,验证没有对这些对象的引用,然后调用 System.gc()。这只是对 JVM 进行 GC 的建议;这不是一个保证。垃圾收集调用会减慢您的应用程序直至冻结(停止世界 GC)。
如果您想管理内存,Java 不适合!或者如果你有很多时间,你可以在 JVM 中编写自己的垃圾收集机制