JDBC ResultSet/语句中的Java内存泄漏

JDBC ResultSet/语句中的Java内存泄漏,java,reflection,memory-leaks,annotations,Java,Reflection,Memory Leaks,Annotations,我有一个自己编写的迷你库,它应该使用反射和注释与MySQL db一起工作。出于某种原因,我的应用程序(使用其代码)存在内存泄漏问题。当我分析它时,它检测到char数组占用了大量内存。谁能给我解释一下怎么了?(导致内存泄漏的函数代码之一) 公共列表选择(类类别、字符串条件、对象…值)引发异常{ Table tbl=(Table)clazz.getAnnotation(Table.class); if(tbl==null)抛出新异常(“指定的类不包含表信息”); StringBuilder strb

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

公共列表选择(类类别、字符串条件、对象…值)引发异常{
Table tbl=(Table)clazz.getAnnotation(Table.class);
if(tbl==null)抛出新异常(“指定的类不包含表信息”);
StringBuilder strb=new StringBuilder();
strb.append(前缀).append(tbl.name());
strb.追加(“WHERE”);
strb.append(条件);
PreparedStatement stmt=con.prepareStatement(strb.toString());
对于(int i=0;i

先谢谢你。PS我不使用此func返回的列表或列表中的元素进行测试

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

您不必关闭结果集和语句吗?据我所知,它应该自动关闭,对此我不确定。只有java 7 new try with resources才是这样吗?public void close()抛出SQLException立即释放此ResultSet对象的数据库和JDBC资源,而不是等待它自动关闭时发生。OMG!你是对的!(非常感谢)把你的答案贴出来,我会接受的
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;
}