测试

设置好你的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的最大值.因此,实现代码如下.

整个程序的运行时间相对于逐增内存的方法呈指数级下降!运行结果如下图所示!