当前位置: 首页 > 知识库问答 >
问题:

以编程方式获取JVM的-Xss最大堆栈大小分配值?

王锐
2023-03-14

我有一个应用程序将失败,如果值设置为低于256k,则Xss堆栈大小将失败,并出现堆栈溢出错误。不幸的是,这与库com有关。太阳组织。阿帕奇。当实例化非常大的XSD验证器时。

现在,-Xss192k的预定义值是我们在某些环境中一直在使用的,并且知道这是导致问题的原因。

出于日志记录的目的,我想知道是否可以通过Java本身获得最大堆栈大小,并在初始化时抛出一个错误,指示提供的堆栈大小不足,而不是让应用程序部署,然后尝试利用堆栈进行此过程,并导致溢出?

日志中当前的堆栈溢出错误(StackOverflowError)对于调试而言相对缺乏信息,我知道捕捉错误是不好的编程礼仪。

具体来说,我想做的是,在伪代码中:

if(jvm.getMaxStackSize() < "256k") {
    throw new Exception("Insufficient Stack Size for this application. Please set to 256k or more.");
} //stop program from continuing because the stack size will result in a stackoverflow if set too low

相关帖子运行一段时间后,可以获得Java线程使用的实际堆栈大小吗?提供了有关如何在运行时监控堆栈大小的信息,但我没有看到获取JVM预设堆栈大小的方法。

共有1个答案

濮景龙
2023-03-14

尝试使用

RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
List<String> args = runtime.getInputArguments();

这应该为您提供创建JVM时传递给它的参数。

 类似资料:
  • 问题内容: 有没有一种方法可以通过编程而不是作为vm参数来设置最大Java堆大小? 就像是: 问题答案: 不适用于任何Hotspot JVM。只能在命令行上指定JVM堆参数,然后在JVM的生存期内对其进行固定。 使用Hotspot Java实现,“更改”应用程序堆大小的唯一方法是使用不同的命令行参数在新的JVM中重新启动它。 (我隐约记得,其他一些供应商的JVM 确实 允许在运行的JVM中更改某些

  • 问题内容: 我试图以编程方式找出用于调用我的程序的JVM的最大permgen和最大堆大小,而不是它们当前可用的大小。 有没有办法做到这一点? 我熟悉Java Runtime对象中的方法,但不清楚它们真正提供了什么。 或者,是否有办法询问Eclipse为这两个分配了多少? 问题答案: 试试这个: 但是它们仅提供快照数据,而不提供累积值。

  • 我试过下面的程序。创建此程序的目的是了解有关堆栈大小的更多信息。 执行上述代码后,由于堆栈大小分配过大,程序崩溃。堆栈的最大可能大小是多少?是否为每个程序/计算机固定?可以增加吗? 我想知道是为了知识。如果有人能提供C/C中的例子,那将是非常有帮助的。

  • 问题内容: 如何从Java程序中获取VM的最小和最大堆大小设置? 问题答案: 最大堆大小: 您可能会发现一些有趣的其他计算:

  • 问题内容: 我正在使用Ubuntu 11.04。如何找出进程的最大调用堆栈大小以及堆栈中每个帧的大小? 问题答案: 您可以使用查询最大进程和堆栈大小。堆栈框架没有固定的尺寸。它取决于每个帧需要多少本地数据(即本地变量)。 要在命令行上执行此操作,可以使用ulimit。 如果要为正在运行的进程读取这些值,我不知道执行此操作的任何工具,但是查询/ proc文件系统很容易:

  • 有很多关于堆大小的帖子和站点,但是没有一个提到在调用JVM时如何找出我可以保留的最大可能堆大小。 任务是用最大可用堆大小xmx=max动态启动我的jvm(这里不需要讨论这个任务的对象!)。 我们可以考虑读取当前可用或空闲的内存,并将该大小用于xms和XMX。但这不起作用。 调用Java程序时: Java-XMS1536M-XMX1536M myApp 导致: 选择您选中的应用程序大约需要的堆。并在