【问题标题】:memory issue with runtime.getruntime.execruntime.getruntime.exec 的内存问题
【发布时间】:2010-12-30 11:22:04
【问题描述】:

有人可以建议 java 的 Runtime.getRuntime().exec 函数的替代方法。我将一个 unix 命令作为参数传递给该函数,但它会导致内存问题。 Runtime.getRuntime().exec fork 一个新进程,其内存量与 java 进程占用的内存量完全相同,导致内存需求翻倍,这正是我不想要的。

【问题讨论】:

  • 当一个进程像这样分叉时,它不会将内存加倍,而是将内存标记为写时复制。子进程不使用额外的内存,除了它使用的内存。
  • “导致内存需求翻倍”:你有什么证据表明内存需求翻了一番?你有一些测量,还是只是你的假设是这样的?我很怀疑。
  • 嗨 Raedwald,我说 mem 要求翻倍是错误的。然而,在我进行了一些测试之后,我发现我可以在我的 unix 机器上运行带有 -Xms3850m 的最简单的 java 程序。但是,当我在我的 java 程序中添加一行“Runtime.getRuntime.exec("test.sh")”时,-Xms 不能大于 2500m,这意味着 Runtime.getRuntime.exec 正在消耗 1350 mb。由于 test.sh 是一个非常简单的脚本,当我在 unix box 上独立运行它时,它不会超过几 mb。您能否建议我如何引导我的 java 程序使用更少的内存而不是使用 1350 mb?谢谢
  • Meraj Alam,您找到问题的答案了吗,我们有没有办法指导 Java 在运行 Runtime.Exec() 命令时不分配相同的内存?。

标签: java unix


【解决方案1】:

这是可选的,取决于操作系统。在 Linux 上,内存是“延迟”分配的,直到真正需要为止。您查找的关键字是“内存过度使用”,这就是这里可能出现的情况。

阅读"How does fork handle memory"this 了解更多信息。您可能已禁用过度使用行为,因此您的分叉进程始终会立即分配所有内存。

【讨论】:

  • 嗨。我说内存需求翻倍是错误的,但它确实显着增加(在我的情况下为 1300mb)。在我进行了一些测试之后,我发现我可以在我的 unix 机器上使用 -Xms3850m 运行我最简单的 java 程序。但是,当我在我的 java 程序中添加一行“Runtime.getRuntime.exec("test.sh")”时,-Xms 不能大于 2500m,这意味着 Runtime.getRuntime.exec 正在消耗 1350 mb。
  • 因为 test.sh 是一个非常简单的脚本,当我在 unix box 上独立运行它时,它不会超过几 mb。您能否建议我如何引导我的 java 程序使用更少的内存而不是使用 1350 mb?谢谢
  • 嗨丹尼尔,过度使用的链接非常有意义。但是,我无法使用它。请指导我如何设置它。
  • 我不知道你的操作系统、版本等,但如果它是 linux,它应该是你可以通过使用 sysctl 及其配套配置文件来控制的东西。
猜你喜欢
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 2011-02-24
  • 2021-12-10
  • 2015-04-29
  • 2014-09-03
  • 1970-01-01
相关资源
最近更新 更多