-1

以下代码片段是否会泄漏内存

一个

BufferedWriter logoutput;
FileWriter fstream = null;
try {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat(DATE_FILE_FORMAT_NOW);
    fstream = new FileWriter("..\\GetInfoLogs\\" + sdf.format(cal.getTime()) + ".log", true);

    logoutput = new BufferedWriter(fstream);
    logoutput.write(statement);
    // Missing fstream.close();
    logoutput.close();
    }
} catch (IOException e) {
    System.err.println("Unable to write to file");
}

    String info[] = {"", ""};
    try {
        conn.setAutoCommit(false);

        Statement stmt = conn.createStatement();
        ResultSet rset = stmt.executeQuery("select ....");

        boolean hasRows = rset.next();
        if (!hasRows) {
            stmt.close();
            return info;
        } else {
            info[0] = rset.getString(1);
            info[1] = rset.getString(2);
        }
        // MISSING rset.close();
        stmt.close();


    } catch (SQLException e) {
        logTransaction(service, "error at getPFpercentage: " + e.getMessage() + " ");

    }
4

2 回答 2

1

不,他们不能。

当程序中不再有对对象的实时引用时,垃圾收集器会收集对象。这通常与它们是否已关闭无关。

关闭一个对象(或在其上调用任何其他方法)可能会影响其收集资格的唯一方法是,是否存在一些持有对该对象的引用的全局结构,并且关闭它具有将其从该结构中删除的副作用。我不知道 JDK 的 IO 库中有任何这样的结构。实际上,JDK 中的 IO 类通常被设计为在它们被垃圾收集时关闭自己,如果它们的打开阻止它们被收集,这将是徒劳的。

像 s 这样的数据库类Connection有点棘手,因为 JDBC 驱动程序提供了实现。编写不佳的 JDBC 驱动程序可能会阻止收集未关闭的对象。不过,这似乎不太可能,因为坦率地说,这将是一个巨大的错误。

您可以使用 JDK 的jmap工具来获取正在运行的应用程序的堆转储。然后,您可以对此进行分析,以尝试找出您的应用程序使用如此多内存的原因。请注意,转储文件很大(比转储堆大),分析它们真的很痛苦。我的一位同事使用 Eclipse Memory Analyzer 插件取得了不错的效果。

于 2013-10-03T10:41:23.540 回答
1

我会推荐使用YourKit Java Profiler,因为它非常直观且易于使用的工具。

在本地启动您的应用程序,将分析器连接到它并执行您的一些应用程序用例。

于 2013-10-03T10:26:28.573 回答