代码改变世界

设置JVM堆大小(解决java.lang.OutOfMemoryError: Java heap space 异常)

2012-11-05 14:40  chloe_zhou  阅读(2487)  评论(0编辑  收藏  举报

 序言

  有时我们需要编写一些比较耗内存的java程序,如压缩解压缩、数据库备份等,运行这些代码时容易报“java.lang.OutOfMemoryError: Java heap space” 异常,这时就需要增大JVM的堆大小了。不管是运行在Tomcat下的网站型程序还是纯java桌面程序,都有很多种设置方法,但是我今天发现不是每个方法都是那么有效,或者说有的方法有特殊值得注意的地方,只有小心谨慎正确地设置才能真正实现增大堆大小。下面我的测试与分析是基于MyEclipse1.6.0和Tomcat6.0.1环境下的,电脑内存为2G。

 正文

  先考虑java桌面程序,因为即使是Tomcat下的Web程序也建立在jvm和纯java代码上的,且单元测试一般不需要在Tomcat下运行。在单独运行某个java文件中的源码时,有以下几种方法设置jvm堆的大小。

  1. 依次选择菜单:Run-->Open Debug Dialog...,打开Debug对话框,在右边区域选择"(x)=Arguments"选项卡,在选项卡中的"VM arguments"下的文本框中填入 -Xms512m -Xmx512m ,即将JVM的最小分配内存和最大分配内存均设置成实际内存的1/4,注意两项设置之间需要有一个或多个空格。这个方法很有效,我测试过,一旦设置完这一项(不用重启MyEclipse),运行之前报错的程序后马上显示正常结果(如果程序本身木有问题的话)~其设置截图如下,

  这个方法只是对当前需要运行的java类有效,如果选择左侧列表中的其他可运行的java类,则 "VM arguments"中的内容为空,因此此方法适用于单元测试。

  2. 依次选择菜单:Window --> Preferences,打开"Preferences"对话框,在左侧树形列表中依次进入Java --> Installed JREs,在右侧列出的的jdk中选中自己默认使用的jdk,如我自己用的"jdk1.6.0"。然后点击"Edit"按钮,打开"Edit JRE"对话框,将对话框中"Default VM Arguments"项设置为 -Xmx512m ,这种设置应该对项目中其他所有类都有效。设置界面如下,

  注意,MyEclipse一般有自带的jdk,名字为"MyEclipse",最好在之前打开的"Preferences"对话框中将其Remove掉,因为在MyEclipse中运行的可执行java类时,默认是通过 MyEclipse自带的jdk运行,这样就导致设置无效。当然,将其自带的jdk的"Default VM Arguments"也一并设置的话也是可以的,设置后不用重启MyEclipse,直接运行java程序就可以了。


对于在tomcat中运行的web程序,可以通过设置tomcat的相关参数来调大JVM的堆分配大小,方法有下述几种。

  1. 修改catalina.bat文件。catalina.bat文件位于Tomcat安装目录下的bin文件夹下,可以用记事本或者EditPlus打开,用Ctrl+F快捷键寻找"rem Guess CATALINA_HOME if not defined",在其下方添加一行"set JAVA_OPTS=-Xms512m –Xmx512m" 即可。

  2. 依次进入Window --> Preferences -->MyEclipse --> Servers --> Tomcat --> Tomcat 6.x --> JDK,设置"Optical Java VM arguments"为 "-Xms512m -Xmx512m"。