gpt4 book ai didi

Java内存泄漏,销毁/终结对象

转载 作者:行者123 更新时间:2023-12-01 07:15:39 29 4
gpt4 key购买 nike

我遇到了内存泄漏,代码类似于下面的代码(这是每个循环都有不同输入的模拟)。

问题

对象 Object_XXX 非常复杂,它与数据库以及其他填充了数据库数据的对象有连接。

    for(int i=0; i<MAX; i=i+1){
Class_XXX Object_XXX = new Class_XXX(Arg_1, Arg_2);

// action with Object_XXX
}

现在,在调用几个方法之后,Object_XXX也可以被丢弃,因为下一个循环将需要具有不同特征的对象(不同的数组、数组的大小、嵌套对象......) .

构造函数与下面类似,其他类也有类似的构造函数。

public Class_XXX(Arg_1, Arg_2, DB_Connection){

try {
Statement Query_Statement = null;
ResultSet Query_ResultSet = null;
String Query_String = null;

Query_String = "...";
Query_Statement = DB_Connection.createStatement();
Query_ResultSet = Query_Statement.executeQuery(SQL);

while (Query_ResultSet .next()) {
this.Param_1 = Query_ResultSet .getString("param_1");
this.Param_2 = Query_ResultSet .getString("param_2");
...
this.Param_n = Query_ResultSet .getString("param_n");
}
} catch (SQLException e) {
System.out.println("SQL Exception: "+ e.toString());
}
}

问题

在这种情况下最正确的方法是什么?a) 在循环结束时完成 Object_XXXb) 当代码中未使用组成 Object_XXX 的每个对象时,最终确定它们吗?就我个人而言,我更喜欢 a) 因为我认为这将使垃圾收集器继续工作而不会造成太多困惑

您还可以提供代码示例或引用吗?

谢谢!

<小时/>

第二轮:

在下面找到答案并查看其他页面( http://accu.org/index.php/journals/236 )后,这是我现在用于构造函数的模板。判断它是否有效还为时过早。仍然存在“exception.toString”,但真正的代码在发生异常时为变量提供标准值,并在日志中报告操作。

public Class_XXX(String Object_Name, java.sql.Connection Query_Connection){

try{ // begin try-catch for Query_Connection
Statement Query_Statement = Query_Connection.createStatement();
try { // begin try-finally for Query_Statement
String Query_String = "SELECT param_1, param_2, ... param_3 FROM table_name WHERE object_name = '" + Object_Name + "'";
ResultSet Query_ResultSet = Query_Statement.executeQuery(Query_String);
try { // begin try-finally for Query_ResultSet

while (Query_ResultSet.next()) {
this.Param_1 = Query_ResultSet.getString("param_1");
this.Param_2 = Query_ResultSet.getString("param_2");
// ...
this.Param_n = Query_ResultSet.getString("param_n");
}

} finally {
try { Query_ResultSet.close(); }
catch (SQLException ex) { System.out.println("Error in Class_XXX constructor - " + ex.toString()); }
} // end try-finally for Query_ResultSet

} finally {
try { Query_Statement.close(); }
catch (SQLException ex) { System.out.println("Error in Class_XXX constructor - " + ex.toString()); }
} // end try finally for Query_Statement

} catch(SQLException ex) {
System.out.println("Error in Class_XXX constructor - " + ex.toString());
} // end try-catch for Query_Connection

}

最佳答案

如果某些对象仍然保留对它的引用,则完成对象不会将其从内存中删除。如果没有任何东西保存引用,垃圾收集器无论如何都会删除它,所以终结在这里没有多大意义。

如果您遇到内存泄漏,则某些东西必须保留对您的对象的引用,因此它们无法被垃圾收集。我建议使用一些分析器来查看它是什么。

关于Java内存泄漏,销毁/终结对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3803485/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com