在做java开发时,为了优化,想把jvm的内存设置大点!但在设置过程中遇到了些怪异的问题。
我用的服务器是server2003版本的,内存有8G,原本我想分jvm 2G内存,在分配的时候一直报could not reserve enough space for object heap
奇怪了,明明有8G内在,怎么才分2G又说没有足够的空间呢?
抱着这个问题,查找了一些资料,其中根据http://wangdei.javaeye.com/blog/204616 文章中的方法测试了下JVM能分配到的空间,结果如下:
测试方法 在CMD的窗口下,输入如下命令: java -Xmx1446m -version 如果不报错,则分配空间成功,如不成功,降低要分配的内存!例如把
java -Xmx1446m -version 修改成 java -Xmx1300m -version
环境:
java 环境
java -version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing)
MWindows XP Professional
core(TM)2 DUO CPU e7200 @2.53GHz 2.00GB内存
java -Xmx1446m -version 1446M
MSwindows Server 2003
Enterprise x64 Edition
core(TM)2 DUO CPU e5520 @2.27GHz 2.26GHz 7.99GB内存
java -Xmx1592M -version 1592M
在linux下:
java 环境
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_14-b04)
Java HotSpot(TM) Client VM (build 14.0-b15, mixed mode, sharing)
linux 2.6.9-78.ELsmp intel xeon E5405 @ 2.00GHz 4128760kb
java -Xmx2690M -version 2690M
然后查找了下文章,一般认为在window下jvm分配的内存突破不了2G linux下很难突破3G ,下面是一些国外人的文章
http://stackoverflow.com/questions/1058471/java-refuses-to-start-could-not-reserve-enough-space-for-object-heap
http://www.theserverside.com/discussions/thread.tss?thread_id=26347
另外说下,在Eclipse和NetBeans下配置 jvm参数的方法吧!
Eclipse下,
在要运行的主类下 点右键, 选run as 或者 debug as,选中 run Configurations ... 在弹出的对话框中选 第二个(x)Arguments 在下方的
vm arguments 中输入
-Xms512m -Xmx1024m -XX:+UseParallelGC -XX:+AggressiveOpts -XX:+UseFastAccessorMethods
其中的 512m和1024M分别是最大和最小内存
NetBeans下,
点要运行的项目,点右键,先最后一项 Categories ,在弹出的对话框里选中run 在右方 的 VM Options 里输入
-Xms512m -Xmx1024m -XX:+UseParallelGC -XX:+AggressiveOpts -XX:+UseFastAccessorMethods
可以用下面的类来测试jvm能开出的内存
public class MemLoadTester {
public static void main ( String[] args ) {
long rand;
char cr;
int mvm=1024;
char[] cra = new char[mvm];
for ( int i=0; i<mvm; i++) {
rand = 70 + Math.round( Math.random() * 50);
cr = (char) rand;
cra[i] = cr;
}
int entities = 400000;
int blocksize = 10240;
String[] zz = new String[ entities];
// Java char type is 2bytes.
System.out.println (" Each box indicates the creation of ~40Meg");
for ( int j=0; j<entities; j++ ) {
zz[j] = new String( cra );
if (j != 0 && j % blocksize == 0 ) {
System.out.print ( "#" );
}
if (j != 0 && j % (blocksize * 10) == 0 ) {
System.out.println ( "" );
}
}
System.out.println( "/n");
System.out.println("Success");
}
}