最近有同学叫我帮忙调试一个内存溢出的问题,根据分析调试发现只是java虚拟机堆配置太小了。
在平时开发时也经常会遇到内存溢出的问题,一般内存溢出分几种情况:
1,程序问题
很多时候写了死循环等低质量的问题,会引起内存溢出,这类内存溢出查起来比较头痛,第一可能代码写的比较隐蔽,第二可能这种情况要在多种条件组合情况下才能出现。也只能一条一条代码的去调试或者打印更多的日志文件进行跟踪了。
2,虚拟机配置问题
java内存分两种:
一种叫栈,给普通常量使用,
第二种叫堆,这种让new出来的对象使用。
在设置虚拟机内存的时候有两个内存可以设置:
第一个叫分配给虚拟机的内存,这个是全部划分给java使用的总内存
第二叫堆内存,对应上面的第二种情况,堆内存一般只有在一次性加载大对象的时候使用到,比如说new了一个特别大的数组,图片等或者说加
载一个很大的第三方jar包的时候,大到超出默认的堆大小就报内存溢出。
3,配置虚拟机内存
java虚拟机后面加上参数-Xms128m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=128m
分配跟虚拟机总内存:
-Xms128m 分配给虚拟机初始内存128m
-Xmx512m 分配给虚拟机最大内存512m
分配给堆内存:
-XX:PermSize=64m 分配给虚拟机堆内存最小64m
-XX:MaxPermSize=128m 分配给虚拟机堆内存最大128m
4,配置服务器内存
一般java应用在应用服务器上,所以只要配置应用服务器的参数就可以,例如tomcat(windows版本)的内存配置有以下几种:
1)免安装版tomcat,在%TOMCAT_HOME%/bin/catalina.bat中加入:
SET CATALINA_OPTS=-Xms128m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=128m;
这种启动配置只有在调用%TOMCAT_HOME%/bin/startup.bat文件才起作用
2)安装版tomcat,在服务管理里有一个服务叫tomcat,进注册表设置
C:/WINNT/system32/regedt32.exe,
在 HKEY_LOCAL_MACHINE-->SOFTWARE-->Apache Software Foundation-->Process Runner 1.0
-->Tomcat5-->Parameters 修改属性: -Xms64m -Xmx128m
3)tomcat5.5后在启动控制台里也可以直接设置。