设置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服务,设置生效.

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/7447773.html,如需转载请自行联系原作者

相关文章
|
10天前
|
Oracle Java 关系型数据库
java体系结构和jvm
java体系结构和jvm
|
1月前
|
DataWorks Java 关系型数据库
DataWorks常见问题之将预警信息发送至邮箱
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
35 1
|
1月前
|
Java 编译器 测试技术
滚雪球学Java(03):你知道JDK、JRE和JVM的不同吗?看这里就够了!
【2月更文挑战第12天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
103 4
|
2月前
|
算法 Java 关系型数据库
掌握这3个技巧,你也可以秒懂JAVA性能调优和jvm垃圾回收
JVM 是一个虚拟化的操作系统,类似于 Linux 和 Window,只是他被架构在了操作系统上进行接收 class 文件并把 class 翻译成系统识别的机器码进行执行,即 JVM 为我们屏蔽了不同操作系统在底层硬件和操作指令的不同。
21 0
|
2月前
|
存储 缓存 算法
深入剖析Java中JVM的内存模型!!!
对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。
46 1
|
1月前
|
存储 Java 数据安全/隐私保护
【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
35 0
|
21天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
60 0
|
1月前
|
Java
【Java】— —实现人物对象的增、删、改、查(注:对象的删除以逻辑删除为主,在person类中设置“删除状态字段”,字删除该字段时,将状态改为有效。)
【Java】— —实现人物对象的增、删、改、查(注:对象的删除以逻辑删除为主,在person类中设置“删除状态字段”,字删除该字段时,将状态改为有效。)
33 0
|
10天前
|
Java
java实现上位机与西门子PLC的通讯设置
这段代码创建了一个ZCAN_Transmit_Data数组,初始化并设置了数组中的第一个元素,包括写入数据、传输类型为1。然后,创建了一个ZCAN_CAN_FRAME对象,指定了CAN_ID和数据长度为8,并将十六进制字符串转换为字节数组填充到数据字段。将这个帧赋值给ZCAN_Transmit_Data对象。最后通过ZLGCAN接口发送数据,如果返回值不等于1,则抛出异常,否则返回发送结果。
|
18天前
|
Java
java中jar启动设置内存大小java -jar 设置堆栈内存大小
java中jar启动设置内存大小java -jar 设置堆栈内存大小
11 1