10

我编写了一个 java 程序,可以在具有不同数量处理器的不同机器上测试几个多线程算法的速度。

在某些机器上,归并排序* 会失败,因为它需要相当大的堆空间来处理非常大的数组。在运行程序之前,我可以自己轻松地更改 Java 堆空间,但我觉得更健壮和简单的方法是从程序本身内部完成这项任务。

有没有办法在 Java 程序的过程中从虚拟机请求/获得更多的堆空间?

注意:我知道我可以使用“java -Xmx1g Program”之类的脚本来执行程序;我对这个主题的好奇心部分是学术性的。

*我的实现不会在线合并。它需要 O(n) 额外的内存。

4

3 回答 3

7

据我所知,没有办法在运行时控制堆大小。

但这可能不是必需的:您可以分别使用 -Xms 和 -Xmx 开关提供最小和最大堆大小。(例如 -Xms128m -Xmx512m)jvm 将在这些范围内管理实际的堆大小。

于 2010-08-04T18:49:21.670 回答
3

Java 并不是为了能够动态管理内存而设计的,在这种情况下是“java 堆空间”,恰恰相反,它的设计目的是让程序员不必担心这一点。

简而言之,恐怕在 Java 中并没有像"malloc()"or那样的东西。"setHeapSize(int byes)"

在 Java 上,当您的程序启动时,您受限于JVM可用的内存量。就内存管理而言,这既是福也是祸。

对于这种动态内存分配,您应该尝试使用类似C和/或C++之类的语言来实现您的算法。

于 2010-08-04T18:40:36.763 回答
2

最大值不是使用的内存大小,这是根据使用情况动态变化的。

最大堆大小应该是您宁愿程序失败而不是使用更多内存的点。动态地改变这一点几乎没有意义,即使是在学术上。

于 2010-08-04T19:21:17.453 回答