设置JVM参数的几种方式解决java.lang.OutOfMemoryError:Java heap space

一.首先给出查询当前JVM内存的代码:

下面是查询当前JVM 内存大小的代码,可以测试设置后JVM 的内存是否会变化。增加JVM 内存的配置项后,无需重新启动eclipse 。具体的代码如下:

 1 public class JvmArguments {
 2     public static void main(String[] args) {
 3         System.out.println("JVM内存信息:");
 4         //最大可用内存,对应-Xmx
 5         System.out.println("最大可用内存(对应-Xmx):" + Runtime.getRuntime().maxMemory()/1024/1024 + "Mb");
 6         //当前JVM空闲内存
 7         System.out.println("当前JVM空闲内存:" + Runtime.getRuntime().freeMemory()/1024/1024 + "Mb"); 
 8         //当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和
 9         System.out.println("当前JVM占用的内存总数:" + Runtime.getRuntime().totalMemory()/1024/1024 + "Mb");
10     }
11 }

关于maxMemory(),freeMemory()和totalMemory():
maxMemory()为JVM的最大可用内存,可通过-Xmx设置,默认值为物理内存的1/4,设值不能高于计算机物理内存;
totalMemory()为当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和,会随着JVM使用内存的增加而增加;
freeMemory()为当前JVM空闲内存,因为JVM只有在需要内存时才占用物理内存使用,所以freeMemory()的值一般情况下都很小,而 JVM实际可用内存并不等于freeMemory(),而应该等于maxMemory()-totalMemory()+freeMemory()

经过个人尝试,我本机8G的内存,可用内存一般在7.8G左右,如果设置的内存大于等于物理内存的1/4,运行Java程序就会报如下错误:

Could not create the java virtual machine

Error occurred during initialization of VM
Could not reserve enough space for object heap

 

所以设置最大可用内存的时候一定要小于物理内存的1/4.

还可以把-Xms和-Xmx对应的数值设置成一样大小.

 

二.关于Eclipse中的eclipse.ini文件

附录我本地Eclipse中的此文件

初学者非常容易混淆eclipse.ini文件的作用,这个文件 是 eclipse 软件的 配置文件,配置了eclipse 启动,eclipse是用Java写的,只不过用的IBM自己的SWT (Standard Widget Toolkit是一个开源的GUI编程框架,与AWT/Swing有相似的用处而已),这里设置的最小内存和最大内存是留给启动eclipse程序的那个虚拟机使用的(这个文件中关于-Xms 和 -Xmx 的设置的是运行当前Eclipse开发工具的JVM内存分配),我们要修改eclipse中java程序的JVM内存大小这里设置是不起作用的。

如上的设置下运行获取JVM内存的代码:

JVM内存信息:
最大可用内存(对应-Xmx):63Mb
当前JVM空闲内存:4Mb
当前JVM占用的内存总数:4Mb

可见eclipse.init中的设置对于Eclipse中的Java代码是不起作用的.

eclipse.int中-vmargs表示以下为虚拟机设置参数,可修改其中的参数值,也可添加-Xmn,-Xss,另外,eclipse.ini内还可以设置非堆内存,如:-XX:PermSize=56m,-XX:MaxPermSize=128m。
此处设置的参数值可以通过以下配置在开发工具的状态栏显示:
在eclipse根目录下创建文件options,文件内容为:org.eclipse.ui/perf/showHeapStatus=true
修改eclipse根目录下的eclipse.ini文件,在开头处添加如下内容:
-debug
options
-vm
javaw.exe
重新启动eclipse,就可以看到下方状态条多了JVM信息。

附录截图:

没有添加设置之前Eclipse的底部对应的状态截图中没有关于JVM的相关参数:

 创建options文件:

修改eclipse.ini文件:

重新启动Eclipse,有了关于JVM参数的显示

关于eclipse.ini文件中的一些错误配置附录:

2. Mistake – eclipse.ini
The memory settings in eclipse.ini is allocated to Eclipse IDE only, not the program you want to run. A very common mistake is updated the heap size in eclipse.ini, and expects it to solve above out of memory problem.

Note
The Java application, Ant / Maven build scripts, or unit test cases, are run as an external tool from Eclipse, and it does not inherit the VM settings in eclipse.ini.
But, if your Eclipse IDE is always crashed by no reason, you can try to increase the heap size and perm gen in eclipse.ini.

 

 三.通过参数调整JVM参数设置

默认的Java虚拟机的大小比较小,在对大数据进行处理时java就会报错:java.lang.OutOfMemoryError。

1、JVM内存分配设置:

1. JVM内存分配设置的参数有四个:
-Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;
-Xms java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;
-Xmn Java Heap Young区大小,不熟悉最好保留默认值;
-Xss 每个线程的Stack大小,不熟悉最好保留默认值;

2. 如何设置JVM的内存分配:

①命令行运行class文件设置

设置jvm内存的方法,对于单独的.class,可以用下面的方法对Test运行时的jvm内存进行设置,(只对当前运行的类Test生效)
java -Xms64m -Xmx256m Test   

②eclipse中的jdk配置处设置全局

打开eclipse-窗口-首选项-Java-已安装的JRE(对在当前开发环境中运行的java程序皆生效)

编辑当前使用的JRE,在缺省VM参数中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m

这里的设置影响整个exlipse中的工程的java虚拟机的内存

③针对某个Java文件设置
 打开eclipse-运行-运行-Java应用程序(只对所设置的java类生效)
选定需设置内存分配的类-自变量,在VM自变量中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m

注:如果在同一开发环境中同时进行了②jdk设置和③针对某个Java文件设置,则③设置生效,②设置无效,如:

开发环境的设置为:-Xmx256m,而类Test的设置为:-Xmx128m -Xms64m,则运行Test时生效的设置为:-Xmx256m -Xms64m

附录截图:

jdk处设置:

RunConfiguration处设置:

运行代码:

 

3.当在服务器环境下(如Tomcat)启动并使用JVM时(对当前服务器环境下所以Java程序生效):

a. 设置环境变量:
变量名:CATALINA_OPTS
变量值:-Xmx128m -Xms64m -Xmn32m -Xss16m
b. 打开Tomcat根目录下的bin文件夹,编辑catalina.bat,在set JAVA_OPTS=%JAVA_OPTS%....这句之后加上:set JAVA_OPTS=%JAVA_OPTS% -Xms1024m -Xmx1024m
c、若没有catalina.bat,只有tomcat.exe,tomcat6w.exe;则可以在启动tomcat6w.exe 后 右键配置--Java--java option 下面输入:
-Xmx256m
-Xms64m
也可以找到注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat6\Parameters\JavaOptions
原值为
-Dcatalina.home="C:\ApacheGroup\Tomcat 6.0"
-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 6.0\common\endorsed"
-Xrs
加入
-Xms300m
-Xmx350m
重起tomcat服务,设置生效.

 

附录一个有价值的帖子:

http://www.mkyong.com/eclipse/eclipse-java-lang-outofmemoryerror-java-heap-space/

 

 

 

 .

 

posted @ 2017-08-29 13:11  SummerChill  阅读(2968)  评论(0编辑  收藏  举报