Java 内存溢出分析

来源:互联网 发布:mac连接wifi共享热点 编辑:程序博客网 时间:2024/05/20 03:06

最近有同学叫我帮忙调试一个内存溢出的问题,根据分析调试发现只是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 SoftwareFoundation-->Process Runner 1.0

                                                 -->Tomcat5-->Parameters修改属性:-Xms64m -Xmx128m

     3)tomcat5.5后在启动控制台里也可以直接设置。

原创粉丝点击