设置JVM参数的几种方式解决java.lang.OutOfMemoryError:Java heap space
一.首先给出查询当前JVM内存的代码:
下面是查询当前JVM 内存大小的代码,可以测试设置后JVM 的内存是否会变化。增加JVM 内存的配置项后,无需重新启动eclipse 。具体的代码如下:
public class JvmArguments {
public static void main(String[] args) {
System.out.println("JVM内存信息:");
//最大可用内存,对应-Xmx
System.out.println("最大可用内存(对应-Xmx):" + Runtime.getRuntime().maxMemory()/1024/1024 + "Mb");
//当前JVM空闲内存
System.out.println("当前JVM空闲内存:" + Runtime.getRuntime().freeMemory()/1024/1024 + "Mb");
//当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和
System.out.println("当前JVM占用的内存总数:" + Runtime.getRuntime().totalMemory()/1024/1024 + "Mb");
}
}
关于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/
.
设置JVM参数的几种方式解决java.lang.OutOfMemoryError:Java heap space的更多相关文章
- Eclipse设置jvm参数的三种方式
方式1. 修改Elipse运行JRE默认JVM参数打开Eclipse,选择Window--Preferences...在对话框左边的树上双击Java,再双击Installed JREs,在右边选择前面 ...
- myeclipse设置jvm参数的三种方式
方法一: 打开eclipse,选择Window--Preferences...在对话框左边的树上双击Java,再双击Installed JREs,在右边选择前面有对勾的JRE,再单击右边的“Edit” ...
- eclipse:Tomcat设置jvm,解决java.lang.OutOfMemoryError: Java heap space 堆内存溢出
eclipse 有启动参数里设置jvm大小,因为eclipse运行时自己也需要jvm,所以eclipse.ini里设置的jvm大小不是具体某个程序运行时所用jvm的大小,这和具体程序运行的jvm大小无 ...
- 内存不足导致的java.lang.OutOfMemoryError: java heap space引出java工程启动参数设置
今天做分类实验,生成了190m的kernel文件,在读到svm中的时候跳出了java.lang.OutOfMemoryError: java heap space异常.随便搜了一下,发现与eclips ...
- 解决eclipse maven install 造成JVM 内存溢出(java.lang.OutOfMemoryError: Java heap space)
maven install 报错信息: The system is out of resources.Consult the following stack trace for details.jav ...
- java.lang.OutOfMemoryError: Java heap space解决方法 (有问题咨询加微信)
支付宝扫码领取最高99元红包,到店支付15天,双十二瓜分15亿,打开支付宝首页搜“555176706”领红包,领到大红包的小伙伴赶紧使用哦! //首先检查程序有没有限入死循环 这个问题主要还是由这个问 ...
- java.lang.OutOfMemoryError: Java heap space解决方法
引起java.lang.OutOfMemoryError: Java heap space异常,可能是由JAVA的堆栈设置太小的原因 根据网上的答案大致有以下两种解决方法: 1.在D:/apache- ...
- 【转】java.lang.OutOfMemoryError: Java heap space的解决
原文地址:http://blog.sina.com.cn/s/blog_4b12778b0100v0bb.html Myeclipse下java.lang.OutOfMemoryError: Java ...
- Exception in thread "main" java.lang.OutOfMemoryError: Java heap space(Java堆空间内存溢出)解决方法
http://hi.baidu.com/619195553dream/blog/item/be9f12adc1b5a3e71f17a2e9.html问题描述Exception in thread &q ...
随机推荐
- MySQL API函数
MySQL提供了很多函数来对数据库进行操作,大致可以分为以下几类: 第一部分 控制类函数 mysql_init()初始化MySQL对象 mysql_options( ...
- lnmp源码编译安装zabbix
软件安装 Mysql 安装 tar xf mysql-5.7.13-1.el6.x86_64.rpm-bundle.tar -C mysql rpm -e --nodeps mysql-libs-5 ...
- spring boot和mybatis入门
[size=x-large]昨天讲了一下spring boot的入门操作相信老手已经明白入门的操作,今天我来讲下我自己的心得,可能与官方有一定差异:希望对大家能有用 一:开门见山首先看工程结构 这里的 ...
- java web 怎么下载大文件(上百M)
Java代码 ; ]; , )) != -) { , bytesRead); 13. } 14. toClient.write(buffer ...
- GetWindowRect
示例代码: CRect rect; GetDlgItem(IDC_STATIC_VIEW)->GetWindowRect(&rect); int width=rect.Width(); ...
- Matlab作图
修改线宽 plot(x,y,'LineWidth',1.5) 在xlabel,ylabel,title中使用latex语言 xlabel('$x$','interpreter','latex') yl ...
- (转)WCF中神秘的“8733"端口和“Design_Time_Addresses”
转自:http://blog.csdn.net/bitfan/article/details/4193319 如果使用Visual Studio 2008 SP1开发WCF应用程序时,会发现当使用Vi ...
- CentOS 5.8下快速搭建FTP服务器
学习安装和配置vsftpd: 实验环境:CentOS 5.8 x86_64 测试环境关掉防火墙和selinux. service iptables stop setenforce 0 1.安装vsft ...
- eclipse/sublime 等宽字体设置
转载请注明出处:http://www.cnblogs.com/wubdut/p/4621889.html 使用ubuntu14.04会产生很多想日犬的地方.大家一般习惯于使用 eclipse 进行 j ...
- hdu 1059
题目大意:就是有价值1.2.3.4.5.6的硬币各多少个,然后让你判断能否把他们分成价值相等的两部分. 题目思路:目测dp,一看果然dp,完全背包,需要剪枝,硬币个数为容量,下标为value,用一个b ...