-1

I'm currently writing a program in Java and it's been a long time since I've done any programming, and even longer since I've done any dynamic memory allocation, and longer yet since I've programmed in Java!

Can you please tell me: should I delete/free/etc dataBytes array, or should I leave it for garbage collection, or will it automatically delete/free the memory when it exits the myFunc() scope?

P.S. I realize that if myFunc isn't called frequently, memory will likely never be an issue but please humor me, as I know I will be using dynamic memory allocation much more in the future as my app gets closer to launch.

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();
    }
}

Thanks for your help!

4

2 回答 2

1

如果无法通过从 GC 根开始的链访问对象,Java 的 GC 会将其视为“垃圾”。

Java中有四种GC根:

  1. 局部变量由线程的堆栈保持活动状态。这不是真实的对象虚拟参考,因此不可见。出于所有意图和目的,局部变量是 GC 根。

  2. 活动 Java 线程始终被视为活动对象,因此是 GC 根。这对于线程局部变量尤其重要。

  3. 静态变量由它们的类引用。这一事实使它们成为事实上的 GC 根源。类本身可以被垃圾收集,这将删除所有引用的静态变量。当我们通常使用应用程序服务器、OSGi 容器或类加载器时,这一点特别重要。

  4. JNI 引用是本机代码作为 JNI 调用的一部分创建的 Java 对象。这样创建的对象会被特殊处理,因为 JVM 不知道它是否被本机代码引用。这样的对象代表了一种非常特殊形式的 GC 根。

我应该删除/释放/等 dataBytes 数组,还是应该将其留作垃圾收集,或者它会在退出 myFunc() 范围时自动删除/释放内存

即使您将dataBytes数组引用设置为null或请求 GC,System.gc()也不能保证。一旦方法返回并且它的堆栈被清除,那么持有对该数组对象的引用的局部变量将被清除。如果该数组对象没有被任何其他活动引用变量引用,它将有资格进行垃圾回收。让JVM负责。

于 2013-07-17T04:38:46.483 回答
1

在 Java 中,您不需要手动释放/删除内存。垃圾收集器会小心的。

此外,每当您创建一个新对象时,它都会在堆上创建。同样,您永远不需要释放任何内存,甚至是堆内存。

于 2013-07-17T04:39:38.940 回答