public class M_index extends Model
{ @Override
protected void executing(HttpServletRequest request, HttpServletResponse response, ModelConfig mc) throws JasperException
{
Pagination p = ArticleDao.list(1, 4);
request.setAttribute("articleList", p.absolutePage());
path = mc.get("to_index");
}
}
ArticleDao.list(1, 4);public static Pagination list(int absolutePage,int pageSize)
{
Pagination p = new P_article_all();
p.setPageSize(pageSize);
p.setAbsolutePage(absolutePage);
return p;
}P_article_all类public class P_article_all extends Pagination{ @Override
public Iterator absolutePage()
{
ArrayList list = new ArrayList();;
String sqlcmd = "SELECT * FROM jh_article ORDER BY wtime DESC LIMIT "+(this.getAbsolutePage()-1)*this.getPageSize()+","+this.getPageSize();
ResultSet rs = Select.select(sqlcmd, "");
try {
ArticleDao.addDataToList(rs, list);
} catch (SQLException ex) {
Log.exception(Log.getLogger("database"), ex, Level.WARNING);
}finally
{
Select.closeResultSet(rs);
}
return list.iterator();
} @Override
public int getRecordTotal()
{
if(recordTotal == 0)
{
int count = 0;
ResultSet rs = Select.select("SELECT count(*) FROM jh_article", ""); try {
if (rs.next()) {
count = rs.getInt(1);
}
} catch (SQLException ex) {
Log.exception(Log.getLogger("database"), ex, Level.WARNING);
}finally
{
Select.closeResultSet(rs);
}
recordTotal = count;
}
return recordTotal;
}}
大家看下,我有没有内存泄露,我实际测试中发现内存泄露,但是我找不出来,帮忙下,如果分数不够,可以在加。可以加到200分
/**
* 查询SQL
* 例: SELECT * FROM WHERE id=? value则对应这个id ,多个value用","隔开
* 没有value,则用""来标识
*
* @param sql
* @param value
* @return ResultSet
* @throws java.sql.SQLException
*/
public static ResultSet select(String sql, String value)
{
if(sql == null || value == null)
{
System.out.println("sql : null");
return null;
}
String[] values=value.split(",");
Log.getLogger("database").info(sql);
ResultSet rs = null;
Connection conn = null;
PreparedStatement ps = null;
try
{
conn = ConnectionPool.getInstance().getConnection();
ps = conn.prepareStatement(sql);
int count = values.length;
if("".equals(value))
{
count = 0;
}
for(int i=0;i<count;i++)
{
ps.setObject(i+1, values[i]);
}
rs = ps.executeQuery();
} catch (SQLException ex)
{
closePreparedStatement(ps);
ex.printStackTrace();
return null;
}finally
{
if(conn !=null)
{
ConnectionPool.getInstance().returnConnection(conn);
}
}
return rs;
}
public static void closePreparedStatement(PreparedStatement ps)
{
if(ps!=null)
{
try {
ps.close();
ps = null;
Log.getLogger("database").info("ps:close");
} catch (SQLException ex) {
Logger.getLogger(Select.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public static void closeResultSet(ResultSet rs)
{
if(rs!=null)
try
{
rs.getStatement().close();
rs = null;
Log.getLogger("database").info("rs:close");
} catch (SQLException ex) {
Logger.getLogger(Select.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
问题,可能出现在两个地方:
一个地方是Statement没有close掉。
另一个,就是list在使用完毕后,没有clear操作。
由于不知道ArticleDao.addDataToList(rs, list);这个静态方法里面,具体的操作内容,所以无法判断是否是list对象引起的。再去看看,有没有什么关于数据的缓存的代码,
内存被暴掉,有可能是缓存的数据,没有及时删除,
或者,ResultSet里面的记录过多,而引起的。
如果是我们一般说的“Java 内存泄露”,其实就是“分配了很多对象,虽然已经不再使用了,但仍然被持有着(比如保存在某个 Collection 中”,那么,其导致的内存不足出的错误是 OutOfMemoryError,而不是楼主这里说的“JAVA SPACE HEAP”错误。这种 HEAP 之类的错误,往往是通过 JNI 调用 Native code 时内存不足而崩出来的错误。结合楼主提的问题,建议你去检查一下所使用的 JDBC Driver,是否有 Native code 的成分、是否有内存泄露的 BUG。另外,报出 HEAP 错误的那个地方,应该还有其它一些错误信息可供参考。
这个没有,就单一的java内存溢出,JAVA SPACE HEAP 我用的是MYSQL 的JDBC驱动包,我觉的这个应该是没有问题的,由于不知道ArticleDao.addDataToList(rs, list);这个静态方法里面,具体的操作内容,所以无法判断是否是list对象引起的。
这个list是由外面引进去的,内部没有任何调用,只是为了把rs里的内容,用对象形式 附加到list里面,用的是引用传递
我记得论坛上谁说过,这样set,会导致占用空间越来越大,试试看在用完之后removeAttribute