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

本文详细介绍了如何查询和调整JVM内存配置,包括通过代码查询当前JVM内存大小的方法、eclipse.ini文件的作用及其常见误区,以及如何通过不同方式设置JVM内存参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.首先给出查询当前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/

 

 

 

 .

 

当你遇到 `java.lang.OutOfMemoryError: Java heap space` 这种错误时,它表示Java虚拟机(JVM)在运行过程中无法分配足够的内存来处理当前的任务。Java堆空间是JVM用于存储对象实例以及数组的主要区域,当程序中的内存消耗超过了这个区域的最大限制,就会抛出此异常。 这通常发生在以下几种情况: 1. **大量对象创建**:如果你正在创建大量的大对象,如大型数据结构、大数据量的数组,或者递归深度过深,都可能导致堆空间不足。 2. **内存泄漏**:如果程序中存在未释放的资源,即使它们不再使用,也会持续占用内存,最终耗尽堆空间。 3. **设置不当的堆大小**:如果你在启动应用时指定了较小的堆大小 `-Xms` 和 `-Xmx` 参数,并且程序的需求超过了这个范围。 4. **长时间运行且不断增长的内存需求**:例如,数据库连接池中的长生命周期连接积累过多。 要解决这个问题,你可以尝试以下几个步骤: - **增加堆大小**:通过修改JVM启动选项,增大 `-Xms` 和 `-Xmx` 的值,给Java更多的内存空间。 - **优化内存使用**:检查代码是否有内存泄漏,及时关闭不需要的对象和资源。 - **调整对象大小和生命周期**:如果可能,考虑减少大对象的使用,或者优化对象的生命周期管理。 - **使用垃圾回收机制**:虽然Java有自动垃圾回收,但如果某些场景下回收不够及时,可以考虑使用并发或分代垃圾回收策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值