我目前正在用Java编写一个程序,自从我完成任何编程以来已经很长时间了,甚至更长时间以来我已经完成了任何动态内存分配,而且自从我用Java编程以来已经更长了!
你能不能告诉我:我应该删除/ free / etc dataBytes数组,还是应该把它留给垃圾收集,还是当它退出myFunc()范围时自动删除/释放内存?
P.S。我意识到,如果不经常调用myFunc,内存可能永远不会成为一个问题,但请幽默我,因为我知道随着我的应用程序接近启动,我将在未来更多地使用动态内存分配。
public void myFunc() {
byte[] dataBytes = null;
try {
// Open data file and read contents to byte array buffer
InputStream inputFile= parent.getAssets().open("myFile.txt");
dataBytes = new byte[inputFile.available()];
taxesFile.read(dataBytes);
taxesFile.close();
return;
} catch (IOException e) {
System.err.println("Failed to open myFile.txt");
e.printStackTrace();
}
}
感谢您的帮助!
答案 0 :(得分:1)
Java的GC会考虑对象"垃圾"如果他们无法通过从GC根开始的链接到达。
Java中有四种GC根:
局部变量由一个线程堆栈保持活动状态。这不是真实对象虚拟参考,因此不可见。对于所有意图和目的,局部变量是GC根。
活动Java线程始终被视为活动对象,因此是GC根。这对于线程局部变量尤其重要。
静态变量由其类引用。这一事实使他们成为事实上的GC根源。类本身可以被垃圾收集,这将删除所有引用的静态变量。当我们使用应用程序服务器,OSGi容器或类加载器时,这一点非常重要。
JNI引用是本机代码作为JNI调用的一部分创建的Java对象。这样创建的对象是专门处理的,因为JVM不知道它是否被本机代码引用。这些对象代表了一种非常特殊的GC根形式。
我应该删除/ free / etc dataBytes数组,还是应该将其保留用于垃圾收集,还是在它退出myFunc()范围时自动删除/释放内存
即使您将dataBytes
数组引用设置为null
或使用System.gc()
请求GC,也无法保证。一旦方法返回并且其堆栈清除,则将清除保存对该数组对象的引用的局部变量。如果该数组对象未被任何其他活动引用变量引用,则它将有资格进行垃圾回收。让JVM小心。
答案 1 :(得分:1)
在Java中,您无需手动释放/删除内存。垃圾收集器会照顾。
此外,无论何时创建新对象,都会在堆上创建它。同样,你永远不需要释放任何内存,甚至是堆内存。