JVM选项 -Xss - 它到底是做什么的?

278

这里中说,-Xss用于“设置线程堆栈大小”,具体是什么意思呢?有人可以帮助我理解一下吗?


这里有一些例子(不是我的...):http://www.herongyang.com/JVM/Stack-Overflow-Xss-JVM-Option-for-Stack-Size.html - Christophe Roussy
5个回答

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

15
所以,“-Xss”选项用于限制堆栈消耗的内存量(通过存储返回地址、变量等),这也间接地限制了堆栈的深度,我的理解正确吗? - instantsetsuna
6
@instantsetsuna:我认为更常见的用法可能是增加默认限制。(总有一个限制。)但是,是的,您正在控制堆栈的大小,从而控制堆栈可以达到多深。 - T.J. Crowder
2
@AndrewNorman 你可以使用“-Jflag”语法(例如“-J-Xss”)为JVM配置标志,编译器应该使用这些标志运行。 - francoisr
@T.J.Crowder 我的问题是关于SBT脚本而不是编译后的类。编译类是个问题(而不是运行类)。我正在尝试找到一个内联设置,可以将其存储在仓库中,而不是在每个构建和开发机器上手动设置XSS。如果您使用Scala与Slick / shapeless持久性和大表格,则在描述具有80-90列的表时会遇到此问题。这是因为该库使用定义的每个列的编译时尾递归来描述表。 - Andrew Norman
我在这个帖子中更多地谈到了我的情况。请查看我的"解决方法"-> https://stackoverflow.com/questions/19825809/out-of-memory-error-during-scala-compilation/49931558#49931558 - Andrew Norman
显示剩余3条评论

200

它确实设置了JVM的堆栈大小。

你应该在以下两种情况下更改它:

  • StackOverflowError(堆栈大小大于限制)时,增加它的值
  • OutOfMemoryError: unable to create new native thread(线程过多,每个线程都有大量堆栈)时,减小它的值。

通常出现在你的Xss设置过大时会出现后一种情况-这时需要平衡它(测试!)


5
并不是每次都会发生。SOE和OOME可能由不同的原因引起,应该采用不同的方法进行修复。 - koders
6
没错,但我并没有说-Xss是导致SOE和OOME的唯一原因,相反,如果设置不正确,它可能会导致其中之一。 - Adam Adamaszek

8

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


5
如果我没有错的话,这就是告诉JVM在发出StackOverflowError之前它将接受多少次连续调用的设置。通常情况下不建议更改此设置。

2

除了已经提到的内容,我想加入我的一些意见:我们可以编写一个简单的演示来展示设置Xss的效果。

一般来说,它控制为每个线程分配的堆栈大小。

    public static void main(String[] args) {
        try{
            recur();
        }catch (StackOverflowError e){
            System.out.println(depth);
        }
    }

    static int depth = 1;

    public static void recur(){
        depth++;
        recur();
    }

在编译以上代码后,您会发现depth(调用层次结构)随传递的Xss设置而增加。在我的本地机器上,java -Xss1m com.eugene.Main的输出为21638,而java -Xss2m com.eugene.Main的输出为48325

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接