此代码中的内存泄漏在哪里?大量使用内存会导致此函数执行数百万次,导致240万次执行后内存不足。
public static void saveCall(Call call) {
conn = getInstance();
if (conn != null) {
try {
calendar.setTime(call.getDate());
String sql = "INSERT INTO Calls(id, datetime, duration, customer_phone_id, partner_phone_id) "
+ "VALUES(null, ?, ?, ?, ?)";
PreparedStatement preparedStatement = conn
.prepareStatement(sql);
preparedStatement.setString(1, dateFormat.format(calendar.getTime()));
preparedStatement.setLong(2, call.getDuration());
preparedStatement.setLong(3, call.getPhone().getPhoneNumber());
preparedStatement.setLong(4, call.getPhonePartner()
.getPhoneNumber());
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:1)
如果您的程序使用大量内存,则可能没有泄漏但只有垃圾收集器问题。 IE浏览器,你的垃圾来得太晚,无法释放一些空间来创建新对象。
从这里开始,您可能希望在运行查询时对代码进行概要分析(随任何jdk提供的visualvm或jconsole)。 你将看到你的内存空间是如何填充的(垃圾行为和对象大小)。
然后,如果需要,您将需要配置您的jvm垃圾收集 这里有大量文档:http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html 如果您共享内存配置文件,我们可能会帮助您配置它。
编辑:内存泄漏,我错了; - )答案 1 :(得分:0)
@Pascal Bayer:你应该在SQL操作后关闭你的连接。带close()的修改后的代码看起来就像下面那样。
public static void saveCall(Call call) {
conn = getInstance();
if (conn != null) {
try {
calendar.setTime(call.getDate());
String sql = "INSERT INTO Calls(id, datetime, duration, customer_phone_id, partner_phone_id) "
+ "VALUES(null, ?, ?, ?, ?)";
PreparedStatement preparedStatement = conn
.prepareStatement(sql);
preparedStatement.setString(1, dateFormat.format(calendar.getTime()));
preparedStatement.setLong(2, call.getDuration());
preparedStatement.setLong(3, call.getPhone().getPhoneNumber());
preparedStatement.setLong(4, call.getPhonePartner()
.getPhoneNumber());
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// good practice of closing connections as soon as
// the SQL operations are completed
if(!conn.isClosed())
conn.close();
}
}
}
干杯, 马杜。
答案 2 :(得分:0)
我的两分钱
在这种情况下,应关闭PreparedStatement
以避免资源泄漏。
public static void saveCall(Call call) {
conn = getInstance();
if (conn != null) {
calendar.setTime(call.getDate());
String sql = "INSERT INTO Calls(id, datetime, duration, customer_phone_id, partner_phone_id) "
+ "VALUES(null, ?, ?, ?, ?)";
PreparedStatement preparedStatement = null;
try {
conn.prepareStatement(sql);
preparedStatement.setString(1, dateFormat.format(calendar.getTime()));
preparedStatement.setLong(2, call.getDuration());
preparedStatement.setLong(3, call.getPhone().getPhoneNumber());
preparedStatement.setLong(4, call.getPhonePartner()
.getPhoneNumber());
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (preparedStatement != null) {
preparedStatement.close();
}
}
}
}
这是Java 7解决方案:
public static void saveCall(Call call) {
conn = getInstance();
if (conn != null) {
calendar.setTime(call.getDate());
String sql = "INSERT INTO Calls(id, datetime, duration, customer_phone_id, partner_phone_id) "
+ "VALUES(null, ?, ?, ?, ?)";
try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
preparedStatement.setString(1, dateFormat.format(calendar.getTime()));
preparedStatement.setLong(2, call.getDuration());
preparedStatement.setLong(3, call.getPhone().getPhoneNumber());
preparedStatement.setLong(4, call.getPhonePartner()
.getPhoneNumber());
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}