内存泄漏预防 - 这是必要的吗?

时间:2013-07-17 04:36:46

标签: java memory-leaks dynamic-memory-allocation

我目前正在用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();
    }
}

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

Java的GC会考虑对象"垃圾"如果他们无法通过从GC根开始的链接到达。

Java中有四种GC根:

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

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

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

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

  5.   

    我应该删除/ free / etc dataBytes数组,还是应该将其保留用于垃圾收集,还是在它退出myFunc()范围时自动删除/释放内存

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

答案 1 :(得分:1)

在Java中,您无需手动释放/删除内存。垃圾收集器会照顾。

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