【问题标题】:Increasing Stack Space, Independent the Machine - Java增加堆栈空间,独立于机器 - Java
【发布时间】:2012-03-15 10:20:07
【问题描述】:

我的算法需要使用比默认允许更多的堆栈空间。我是否必须增加每台机器上的堆栈空间,或者有没有办法将它包含在类中以便它可以在每台机器上顺利运行。

【问题讨论】:

  • 我会改变算法,这样它就不会使用太多的堆栈空间。即使在 C 语言中,您也无法增加正在运行的程序的堆栈大小。
  • @Peter Lawrey - 该算法涉及深度优先搜索,这就是为什么如此密集,但我现在会尝试迭代地进行......
  • 迭代地做这件事并不总是那么容易,但如果你能做到,就不会有这个问题。你可能会发现你可以根据你正在做的事情来减少递归的深度。例如你可以总结一个列表 - > list.get(0) + sum(list.subList(1, list.size()) 深度为 list.size() 或 sum(list.subList(0, list.size()/2)) + sum(list.subList(list.size()/2, list.size())) 深度为 log2(list.size())

标签: java stack


【解决方案1】:

你的后一种方法行不通 - 堆栈空间是一个启动参数,用于为 Java 进程本身分配空间。

当一切都设置好加载和执行类时,根据定义,进程已经存在并且它的堆栈大小已经确定。你不能在运行时修改Xss。

通常你会做的是分发一个启动脚本,它使用适当的内存参数启动你的应用程序。你的类是如何被调用的?如果它是一个库,那么 应用程序的 工作就是确保分配足够的内存,可以说您可以将其列为文档中的要求。

在极端情况下,您可以使用Process 以您想要的启动参数生成一个全新的 Java 进程 - 但是这很容易出错,需要假设 java 在路径上(或到处都存在相同的目录结构),您有权创建新进程,该新进程存在足够的内存/文件句柄等。这不是我想要做的事情,但是如果您用尽所有 其他选项可能会让你在紧要关头度过难关。

【讨论】:

  • 所以在加载我的程序之前需要在每台机器上运行 Xmx 参数?
  • 您必须使用启动脚本(start.sh、start.bat)交付您的应用程序。此 scipt 将使用指定的参数启动应用程序。 Xmx 值将在此处指定。因此,您不必手动更改任何内容。每次启动脚本都会为您完成。
  • 我不确定您所说的“在每台机器上运行”是什么意思。您的类将加载到 JVM 中,该 JVM 以某种方式 启动,并且在创建此 JVM 时,堆栈大小参数将被处理。您需要确保使用足够大的堆栈创建这些 JVM。你实际上如何做到这一点完全取决于你的课程是如何被执行/导入的/你有什么。如果它是您为其分发启动脚本的应用程序,那么您只需对启动脚本进行一次更改即可。
  • Xmx 不设置堆栈大小,而是设置堆大小。这是 Xss。
【解决方案2】:

堆栈大小是 JVM 配置,因此需要在您运行的每台机器上进行设置。没有办法从 Java 内部做到这一点。

但是,听起来您应该专注于减少堆栈使用。简单的方法是专注于减少每个堆栈名的大小,以及分配的帧数(即递归深度)。更难但更强大的方法是将递归转换为迭代,使用在堆上分配的显式堆栈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-25
    • 2016-11-26
    • 2020-11-12
    • 2019-01-23
    • 1970-01-01
    • 2021-04-05
    • 2016-11-17
    • 2011-01-14
    相关资源
    最近更新 更多