【问题标题】:dynamically increasing java heap space动态增加java堆空间
【发布时间】:2011-03-25 10:20:36
【问题描述】:

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

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

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

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

*我的实现没有内联合并。它需要 O(n) 额外的内存。

【问题讨论】:

  • 我认为这是不可能的。

标签: java heap-memory mergesort scalability


【解决方案1】:

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

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

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

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

【讨论】:

  • Erm,Windows 的 Sun JVM 确实在 -Xms 和 -Xmx 给出的限制内调整了堆的大小(即从操作系统请求或返回内存)。例如,您可以在 visualvm 中看到这一点。
  • 好吧,java 中的关键字 new 实际上等同于 c 中的 malloc() ,就像它在 c++ 中一样。但是谢谢;这可以解决问题。
  • 你在混合概念。有人可能想要动态更改最大可用堆大小的事实与 VM 旨在释放程序员进行内存管理这一事实无关。作为系统管理员,我可能误判了我的应用程序的堆空间需求,我想在不重新启动应用程序的情况下增加它。调整堆空间的大小在技术上是可行的,因为 JVM 自己会这样做(从最小值到最大值)。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-11-26
      • 2019-01-23
      • 1970-01-01
      • 2016-11-17
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 1970-01-01
      相关资源
      最近更新 更多