软件工程师!
分类: C/C++
2010-07-12 08:43:59
作者:忙碌命
Blog: http://blog.csdn.net/laiboy
Java的虚拟机最大的内存是多少?资料上有说在Windows上内存可以达到1200M至1500M左右,在Linux上可以达到2600M左右,但是总的来说,JVM的内存的大小与是跟操作系统的版本和JVM的版本有关,所以,还是要试验才可以知道实际情况.
设置好你的JRE或JDK的环境路径到系统的PATH,在命令行下输入以下命令:
Java -Xmx1446M -version
如下图所示的输出
从以上图可以看到,我的机子上的JVM的内存最多可以达到1446M.
很简单就可以试出来了,不是吧,但是你要记得,JVM的内存大小是与操作系统与JVM的版本有关系的.所以首先你要猜猜是多少,然后再不停地敲上面这个命令
Java -Xmx1024M -version
Java -Xmx1028M -version
........
手打累了~~~
说真的,你嫌烦我也嫌打得累!
重复的事情,程序解决!
1.判断成功与否.
2.逐步逼近最大值.
这就是我们设计程序去解决这个问题的两个步骤,第一个是比较简单,就是获取命令行的输出,判断第一行文本就知道JVM是否创建成功了.具体原理就不说了,看代码,创建一个CUI的进程,将输出文本用管道(Pipe)截取.
以上为实现代码,在演示程序中的ExecuteCommand函数中.
第二个比较复杂一点,但是流程也如下图所示,当到达某点值时,再增大-X的值时就失败了,所以我们就只需要判断该点是什么.最简单的就是逐渐加大数值,但是效率太低,我不喜欢.
但是,看上面的图,大概可以知道,在8G内存的时候,如果要逐加,假设从1M开始,最低也要8192次才能到达内存,这样太浪费时间了,用二分法可以降低运行次数.
假设开始1M到8000M.1M时创建JVM成功,8000M时创建JVM失败.
则肯定最大值在1M到8000M之间.将其再分成两部分[1M,4000M],
[4000M,8000M],如果1M成功,4000M失败,则最大值肯定在1M到4000M之间,[4000M,8000M]这个区间不需要再计算了.将[1M,4000M]再分成两个区间,
[1M,2000M],[2000M,4000M],重复以上判断,则肯定在1M到2000M之间,再重复以上步骤,最终的结束条件就是,[a,b],a值时成功,b值是失败,b-a的值为1,则a的值为JVM的最大值.因此,实现代码如下.
整个程序的运行时间相对于逐增内存的方法呈指数级下降!运行结果如下图所示!
|