Productions服务器上的OutOfMemoryExceptions

时间:2013-10-03 10:13:20

标签: java tomcat

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

A

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() + " ");

    }

2 个答案:

答案 0 :(得分:1)

我建议使用YourKit Java Profiler,因为它非常直观且易于使用。

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

答案 1 :(得分:1)

不,他们不能。

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

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

Connection这样的数据库类有点棘手,因为它有JDBC驱动程序提供的实现。编写糟糕的JDBC驱动程序可能会阻止收集未关闭的对象。但是,这似乎不太可能,因为那将是一个巨大的搞砸,坦率地说。

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