上面写着here,-Xss是用来“设置线程堆栈大小”的,这到底是什么意思?有人能帮我理解吗?
vsmadaxz1#
Java应用程序中的每个线程都有自己的stack。堆栈用于保存返回地址、函数/方法调用参数等。因此,如果线程倾向于通过递归算法处理大型结构,则可能需要一个大型堆栈来保存所有这些返回地址等。使用Sun JVM,您可以通过该参数设置堆栈大小。
bakd9h0s2#
它实际上设置了JVM上的堆栈大小。在以下两种情况下,您都应该触摸它:
*StackOverflowError(堆栈大小大于限制),增加该值*内存不足错误:无法创建新本机线程(线程太多,每个线程都有一个大堆栈),请减少堆栈。
后者通常出现在Xss设置得太大的时候--然后你需要平衡它(测试!)
jdgnovmf3#
每个线程都有一个堆栈,用于存储局部变量和内部值。堆栈的大小限制了调用的深度。通常情况下,这是不需要更改的。
kgsdhlau4#
如果我没有弄错的话,这就是告诉JVM在发出StackOverflowError之前它将接受多少连续调用的代码。通常您不希望更改它。
z4iuyo4d5#
在这里加上我的两分钱,除了提到的,我们可以写一个简单的演示来展示设置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。
depth
Xss
java -Xss1m com.eugene.Main
21638
java -Xss2m com.eugene.Main
48325
5条答案
按热度按时间vsmadaxz1#
Java应用程序中的每个线程都有自己的stack。堆栈用于保存返回地址、函数/方法调用参数等。因此,如果线程倾向于通过递归算法处理大型结构,则可能需要一个大型堆栈来保存所有这些返回地址等。使用Sun JVM,您可以通过该参数设置堆栈大小。
bakd9h0s2#
它实际上设置了JVM上的堆栈大小。
在以下两种情况下,您都应该触摸它:
*StackOverflowError(堆栈大小大于限制),增加该值
*内存不足错误:无法创建新本机线程(线程太多,每个线程都有一个大堆栈),请减少堆栈。
后者通常出现在Xss设置得太大的时候--然后你需要平衡它(测试!)
jdgnovmf3#
每个线程都有一个堆栈,用于存储局部变量和内部值。堆栈的大小限制了调用的深度。通常情况下,这是不需要更改的。
kgsdhlau4#
如果我没有弄错的话,这就是告诉JVM在发出StackOverflowError之前它将接受多少连续调用的代码。通常您不希望更改它。
z4iuyo4d5#
在这里加上我的两分钱,除了提到的,我们可以写一个简单的演示来展示设置Xss的效果。
一般来说,它控制安排给每个线程的堆栈大小。
编译以上代码后,您将看到
depth
(调用层次结构)与传递的Xss
设置一起增长。在我的本地计算机上,
java -Xss1m com.eugene.Main
的输出是21638
,java -Xss2m com.eugene.Main
的输出是48325
。