我编写了一个java程序,用于测试具有不同处理器数量的不同机器上的几个多线程算法的速度。
在某些机器上,merge sort *失败,因为它需要一个相当大的堆空间来处理非常大的数组。在运行程序之前,我可以自己轻松地更改java堆空间,但我觉得从程序本身开始执行此任务是一种更健壮,更简单的方法。
有没有办法在java程序中从虚拟机请求/获得更多堆空间?
注意:我明白我可以用“java -Xmx1g Program”这样的脚本执行程序;我对这个问题的好奇心部分是学术性的。
*我的实现不会在线合并。它需要额外的O(n)内存。
答案 0 :(得分:6)
据我所知,在运行时无法控制堆大小。
虽然可能没有必要:您可以分别使用-Xms和-Xmx开关提供最小和最大堆大小。 (例如-Xms128m -Xmx512m)jvm将管理这些边界内的实际堆大小。
答案 1 :(得分:2)
Java没有设计能够动态管理内存,在这种情况下“java堆空间”,相反,它的设计是为了减轻程序员不必担心的问题。
简而言之,我不敢说Java中没有"malloc()"
或"setHeapSize(int byes)"
。
在Java上,当你的程序启动时,你会限制JVM可用的内存量。在内存管理方面,这既是一种祝福,也是一种诅咒。
对于这种动态内存分配,您应该尝试使用C
和/或C++
之类的语言来实现您的算法。
答案 2 :(得分:2)
最大值不是所用内存的大小,这是基于使用情况的动态。
最大堆大小应该是您希望程序失败的点,而不是使用更多内存。动态地改变它是没有意义的,甚至在学术上也是如此。