转载于:http://wangdei.iteye.com/blog/204616
最近在开发Java的程序。本来我是一直很喜欢Java的内存管理的,不需要担心分配内存,只管分配,垃圾收集器自己会给你回收内存的。现在开发的程序数据量很大,为了速度快,我准备把所有的信息加载进内存,这样可以保证快速响应。我还在反复算内存,想想自己的数据量,现在刚开始的时候应该够了(我的机器是4G内存,虽然Windows就认3.5G,但是比起我现在的数据量应该没问题)。
没想到第一个实验的程序,跑了几个小时,就遇到了Out of Memory Exception了。看看自己的虚拟机设置,我设置的是-Xms512M -Xmx1024M。想都没想,直接改成-Xms512M -Xmx2048M,结果直接就Could not reserve enough space for object heap。程序都起不来了。这才发现原来最大内存还有限制。上网搜了一下,发现很多讨论这个问题的文章。最终在BEA的DEV2DEV论坛发现了最有用的一篇http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&threadID=35704&start=0&tstart=0
这里的版主 做了测试,得出结论:
我现在用的是JDK1.6. 0_05,测试了一下。在Client状态下最大是,我的JDK不认-Server参数,测试不了Server状态。估计差不多。
看样子用Java想用大内存也是不可能的了。而且一般的说法是内存太大了,垃圾收集的时间就会长。这也可以理解,一般是内存不够用了才收集的,扫描2G内存比1G当然要慢多了,而且内存对象多了,估计关系是指数上升的。
下面附上YuLimin的测试方法和测试记录。
测试方法:
测试记录:
我在Windows 2000 ADS上面测试内存使用的结果如下 SUN的1.2.2、1.3.1、1.4.2、1.5.0、IBM1.4.2、BEA JRockit 1.4.2
F:\JDK\1.2.2\bin>java -Xmx700000255M -version F:\JDK\1.2.2\bin>java -Xmx700000256M -version F:\JDK\1.3.1\bin>java -version F:\JDK\1.3.1\bin>REM If present, the option to select the VM must be first. F:\JDK\1.3.1\bin>REM The default VM is -hotspot. F:\JDK\1.3.1\bin>java -hotspot -Xmx1554M -version F:\JDK\1.3.1\bin>java -hotspot -Xmx1555M -version F:\JDK\1.3.1\bin>java -server -Xmx1522M -version F:\JDK\1.3.1\bin>java -server -Xmx1523M -version F:\JDK\1.3.1\bin>java -classic -Xmx2047M -version F:\JDK\1.3.1\bin>java -classic -Xmx2048M -version F:\JDK\1.4.2\bin>java -version F:\JDK\1.4.2\bin>REM The default VM is client. F:\JDK\1.4.2\bin>java -client -Xmx1308M -version F:\JDK\1.4.2\bin>java -client -Xmx1309M -version F:\JDK\1.4.2\bin>java -server -Xmx1308M -version F:\JDK\1.4.2\bin>java -server -Xmx1309M -version F:\JDK\1.4.2\bin>REM -hotspot is a synonym for the “client” VM [deprecated] F:\JDK\1.4.2\bin>java -hotspot -Xmx1308M -version F:\JDK\1.4.2\bin>java -hotspot -Xmx1309M -version F:\JDK\1.5.0\bin>java -version F:\JDK\1.5.0\bin>java -client -Xmx1492M -version F:\JDK\1.5.0\bin>java -client -Xmx1493M -version F:\JDK\1.5.0\bin>java -server -Xmx1504M -version F:\JDK\1.5.0\bin>java -server -Xmx1505M -version F:\JDK\1.5.0\bin>REM -hotspot is a synonym for the “client” VM [deprecated] F:\JDK\1.5.0\bin>java -hotspot -Xmx1492M -version F:\JDK\1.5.0\bin>java -hotspot -Xmx1493M -version F:\JDK\IBM142\bin>java -version F:\JDK\IBM142\bin>REM The default VM is client. F:\JDK\IBM142\bin>java -Xmx2047M -version F:\JDK\IBM142\bin>java -Xmx2048M -version abnormal program termination F:\BEA\JRockit\bin>java -version F:\BEA\JRockit\bin>REM The default VM is jrockit. F:\BEA\JRockit\bin>java -Xmx1617M -version F:\BEA\JRockit\bin>java -Xmx1618M -version F:\BEA\JRockit\bin>REM -jrockit to select the “jrockit” VM F:\BEA\JRockit\bin>java -jrockit -Xmx1617M -version F:\BEA\JRockit\bin>java -jrockit -Xmx1618M -version |
我的测试记录:
C:\Documents and Settings\xiaoyuma>java -client -Xmx1441M -version
java version “1.6.0_05″
Java(TM) SE Runtime Environment (build 1.6.0_05-b13)
Java HotSpot(TM) Client VM (build 10.0-b19, mixed mode)
C:\Documents and Settings\xiaoyuma>java -client -Xmx1442M -version
java version “1.6.0_05″
Java(TM) SE Runtime Environment (build 1.6.0_05-b13)
Java HotSpot(TM) Client VM (build 10.0-b19, mixed mode)
C:\Documents and Settings\xiaoyuma>java -client -Xmx1443M -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
C:\Documents and Settings\xiaoyuma>java -server -Xmx1443M -version
Error: no `server’ JVM at `C:\Program Files\Java\jre1.6.0_05\bin\server\jvm.dll’.