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