JVM选项-Xss-到底有什么用?


Answers:


269

Java应用程序中的每个线程都有其自己的堆栈。堆栈用于保存返回地址,函数/方法调用参数等。因此,如果线程倾向于通过递归算法处理大型结构,则所有这些返回地址等都需要大型堆栈。使用Sun JVM,可以通过该参数设置该大小。


11
因此,-Xss选项用于限制堆栈消耗多少内存(通过存储返回地址,变量等),并且还间接限制堆栈可以达到的深度?我对么?
Instantsetsuna

5
@instantsetsuna:我认为更常见的用途可能是增加默认限制。(总会有一个限制。)但是,是的,您正在控制堆栈的大小,该大小控制堆栈可以达到的深度。
TJ Crowder

在Java编译器(又名javac)上,您如何等效于此XSS设置?对于那些使用基于Scala的库的人来说,这是一个问题,这些库在类的编译中发生大尾递归– 9秒钟前的
Andrew Norman

@AndrewNorman:您不必将Java运行时选项编译到类文件中,这更多是特定于环境的。如果您确实需要在代码中执行此操作,则可以编写一个很小的主类,其唯一的工作就是使用所需的选项启动真正的应用程序。
TJ Crowder

@AndrewNorman您可以使用-Jflag语法(例如-J-Xss)为编译器应使用的JVM配置标志提供运行。
francoisr

166

实际上,它在JVM上设置了堆栈大小。

在以下两种情况下,您都应该触摸它:

  • StackOverflowError(堆栈大小大于限制),增加该值
  • OutOfMemoryError:无法创建新的本机线程线程太多,每个线程都有大堆栈),请减少它。

后者通常在Xss设置太大时出现-然后您需要平衡它(测试!)


3
不一定每次都实际。SOE和OOME都可能由于不同的原因而发生,因此应以不同的方式进行固定。
noego 2015年

4
是的,但我没有说-Xss是SOE和OOME的唯一原因,但反之亦然-如果设置不正确,它可能会导致这两者之一。
亚当·阿达马塞克

5

每个线程都有一个用于局部变量和内部值的堆栈。堆栈大小限制了调用的深度。通常,这不是您需要更改的内容。


4

如果我没记错的话,那就是告诉JVM在发出StackOverflowError之前它将接受多少次连续调用。您一般不希望更改。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.