后台表很大,有几十万行数据,如果想全部查询时出错:java.lang.OutOfMemoryError: Java heap space代码如下:
Session session=HibernateSessionFactory.getSession();
Query query=session.createQuery("from XXX");
List list=query.list();
System.out.println(list.size());
------解决方案--------------------
楼主的问题是内存泄漏
这个问题的根源是jvm虚拟机的默认Heap大小是64M,可以通过设置其最大和最小值来实现.设置的方法主要是几个.
1.可以在windows 更改系统环境变量
加上JAVA_OPTS=-Xms64m -Xmx512m
2,如果用的tomcat,在windows下,可以在
C:\tomcat5.5.9\bin\catalina.bat 中加上:
set JAVA_OPTS=-Xms64m -Xmx256m
位置在: rem Guess CATALINA_HOME if not defined 这行的下面加合适.
3.如果是linux系统
Linux 在{tomcat_home}/bin/catalina.sh的前面,加
set JAVA_OPTS='-Xms64 -Xmx512'
------解决方案--------------------
更改服务器的内存是可以实现的
但还是有一定的限制的,如果数据量变大,就不好控制了
所以说不能采取硬件措施,应从软件入手:分页取数据
Session session=HibernateSessionFactory.getSession();
Query query=session.createQuery("from XXX");
query.setMaxResults(pageSize);
query.setFirstResult(startIndex);
int totalRec = totalCount;
//pageInfo是分页类
pageInfo.setTotalRec(totalRec);
if (startIndex == 1)
pageInfo.setPageIndex(1);
int totalPage = (totalRec % pageSize == 0) ? (totalRec / pageSize)
: (totalRec / pageSize) + 1;
pageInfo.setTotalPage(totalPage);
pageInfo.setPageSize(pageSize);
pageInfo.setPageIndex(pageIndex);
pageInfo.setPrePage(pageIndex - 1);
pageInfo.setNextPage(pageIndex + 1);
List list=query.list();
System.out.println(list.size());