以下代码片段是否可以泄漏内存
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() + " ");
}
答案 0 :(得分:1)
我建议使用YourKit Java Profiler,因为它非常直观且易于使用。
在本地启动您的应用程序,将分析器连接到它并执行一些应用程序用例。
答案 1 :(得分:1)
不,他们不能。
当程序中不再有对象时,垃圾收集器会收集对象。这通常与它们是否已被关闭无关。
关闭一个对象(或调用其上的任何其他方法)的唯一方法可能影响它的收集资格,如果有一些全局结构持有对象的引用,关闭它有副作用从它删除它这个结构。我不知道JDK的IO库中有任何这样的结构。实际上,JDK中的IO类通常设计为在收集垃圾时关闭自己,如果它们被打开阻止它们被收集,这将是徒劳的。
像Connection
这样的数据库类有点棘手,因为它有JDBC驱动程序提供的实现。编写糟糕的JDBC驱动程序可能会阻止收集未关闭的对象。但是,这似乎不太可能,因为那将是一个巨大的搞砸,坦率地说。
您可以使用JDK的jmap
工具来获取正在运行的应用程序的堆转储。然后,您可以对此进行分析,以尝试找出应用程序使用如此多内存的原因。请注意,转储文件很大(比转储堆大),分析它们真的很痛苦。我的一位同事使用Eclipse Memory Analyzer plugin获得了很好的结果。