JDBC 结果集/语句中的 Java 内存泄漏

标签 java reflection memory-leaks annotations

我有一个自己编写的迷你库,它应该使用反射和注释与 MySQL 数据库一起使用。由于某种原因,我使用其代码的应用程序存在内存泄漏问题。当我分析它时,它检测到字符数组消耗了大量内存。谁能解释一下我出了什么问题吗? (导致内存泄漏的函数代码之一)

public List select(Class clazz, String condition, Object... values) throws Exception{
    Table tbl = (Table) clazz.getAnnotation(Table.class);
    if(tbl==null) throw new Exception("Specified class doesnt contain table information");

    StringBuilder strb = new StringBuilder().append("SELECT * FROM `");
    strb.append(prefix).append(tbl.name());
    strb.append("` WHERE ");
    strb.append(condition);

    PreparedStatement stmt = con.prepareStatement(strb.toString());
    for (int i = 0; i < values.length; i++) {
        stmt.setObject(i + 1, values[i]);
    }

    ResultSet rs = stmt.executeQuery();
    ArrayList result = new ArrayList<>();
    while(rs.next()){
        Object o = clazz.newInstance();
        for(Field f : clazz.getFields()){
            Table.Column col = f.getAnnotation(Table.Column.class);
            if(col!=null){
                if(!f.isAccessible())
                    f.setAccessible(true);
                f.set(o, rs.getObject(f.getName()));
            }
        }
        result.add(o);
    }
    return result;
}

提前谢谢您。 PS 我没有使用此函数返回的列表或列表中的元素用于测试目的

最佳答案

您必须关闭结果集和语句。

关于JDBC 结果集/语句中的 Java 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22358465/

相关文章:

java - 使用 JAVA 从 JSON 文件(嵌套对象数组)打印特定值

Java Servlet - 从 html 文件输入中获取 byte[] 内容

c++ - 为什么这不是 C++ 中的内存泄漏?

ios - WkWebView 实例化中的内存泄漏

java - 与 Java EE 一起使用的最佳 LDAP 服务器

java - Eclipse 未加载 WAR 文件

c# - 从派生自基类的程序集中获取所有类型

c# - 如何使用 lambda 表达式作为参数通过反射调用方法?

c# - 反射(reflection)继承的私有(private)方法

c++ - 检测到内存泄漏