异常名称:堆内存溢出
异常出现背景:
大量用户访问一个从数据库获取大量数据的业务功能。
异常出现原因分析:
从jvm的角度看发生的情况是:
1、动态扩展的栈内存无法满足内存分配。
2、建立新的线程没有足够内存创建栈。
从编码角度看发生的情况是:
1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2、集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
3、代码中存在死循环或循环产生过多重复的对象实体;
4、使用的第三方软件中的BUG;
5、启动参数内存值设定的过小;
解决方案:
1、分批读取数据库数据
2、及时清空代码中没用的集合
3、-Xms -Xmx 配置最大最小堆内存大小,默认 -Xms256m -Xmx512m
windows 系统可以在C:\tomcat\bin\catalina.bat 中
位置在: rem Guess CATALINA_HOME if not defined 这行的下面加上:
set JAVA_OPTS=-Xms256m -Xmx1024m
linux系统 在{tomcat_home}/bin/catalina.sh里,加 set JAVA_OPTS='-Xms256 -Xmx1024'