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

给JVM的线程堆栈大小选项(-XSS)是什么?为什么它在windows PC中有至少68K的限制?

司徒鸿文
2023-03-14

我见过JVM选项-XSS-它到底做什么?这个链接,但我的问题是这个选项怎么有用。

因为如果我们对-xss值设置一个最小的限制,线程可能无法正常工作,因为它可能在大多数情况下引发stackOverflow错误。

为什么这个值至少有64K限制?
我是如何获得这个64K限制的,当我试图在IntelliJ iDE上配置运行时vm选项时,我试图给出一些类似10K的东西,但它弹出这个错误,说明线程堆栈大小至少需要64K。

另一个问题是,如何从java程序中找到在嵌入式设备中运行的jvm的默认线程堆栈大小?

谢谢,

共有1个答案

贾烨
2023-03-14

-xss允许根据html" target="_blank">应用程序需要配置Java线程堆栈大小:

  • 较大的堆栈大小适用于使用递归算法或其他深度方法调用的应用程序;
  • 较小的堆栈大小适用于运行数千个线程的应用程序-您可能希望节省线程堆栈占用的内存。

请记住,HotSpot JVM还将相同的Java线程堆栈用于本机方法和JVM运行时调用(例如,类加载)。这意味着Java线程堆栈不仅用于Java方法,而且JVM也应该为自己的操作保留一些堆栈页。

(StackYellowPages + StackRedPages + StackShadowPages + 2*BytesPerWord + 1) * 4096

哪里

    需要
  • StackYellowPagesStackRedPages来检测和处理StackOverflowError;
  • StackShadowPages是为本机方法保留的;
  • 2*4(32位JVM)或2*8(64位JVM)用于VM运行时函数;
  • 额外1用于主线程中的JIT编译器递归;
  • 4096是默认页面大小。

例如。对于32位Windows JVM,最小堆栈大小=(3+1+4+2*4+1)*4K=68K

-XX:StackYellowPages=1 -XX:StackRedPages=1 -XX:StackShadowPages=1
 类似资料:
  • 我知道如何使用-Xss为java线程设置堆栈大小,我们在产品中使用它。 但是当我们的应用程序中使用了很多线程,并且设置了-Xss(我们设置为512k我们的使用)。我们会遇到错误报告无法创建新的本机线程。它应该与堆栈大小有关,因为当我们设置-Xss256k时,错误消失了。 我的问题是对于1个线程,Xss设置堆栈大小,但是对于所有线程,堆栈大小如何<整个线程的总堆栈内存大小的限制是什么?我没有发现这样

  • 在堆上分配内存时,唯一的限制是可用RAM(或虚拟内存)。它产生Gb的内存。 那么,为什么堆栈大小如此有限(大约1 Mb)?什么技术原因阻止您在堆栈上创建真正大的对象? 更新:我的意图可能不清楚,我不想在堆栈上分配巨大的对象,也不需要更大的堆栈。这个问题只是纯粹的好奇心!

  • 问题内容: 它在这里说-Xss用于“设置线程堆栈大小”,这到底是什么意思?谁能帮我理解这一点? 问题答案: Java应用程序中的每个线程都有其自己的堆栈。堆栈用于保存返回地址,函数/方法调用参数等。因此,如果线程倾向于通过递归算法处理大型结构,则所有这些返回地址等都需要大型堆栈。使用SunJVM,可以通过该参数设置该大小。

  • 从文档中可以看出,-Xss用于设置JVM的堆栈大小。但我对这一说法感到非常困惑。 在Java中,每个线程都有自己的堆栈。-Xss指定的数字是否: > 线程的每个堆栈的大小。e、 如果将-Xss设置为256K,则每个线程将有一个256K大的堆栈。因此,10个线程将总共使用2560K。 非常感谢你。 编辑: 谢谢你的回答。看起来像是上面的(2)senario-Xss指定特定线程的最大堆栈大小。 然后我

  • 我为我的Java web应用程序分配了一个最大值。由于一些内存泄漏,应用程序已经消耗了将近2 GB的分配内存。此时,我已经使用进行了内存转储。在一个实例中,堆转储大小接近>1.5GB,而在另一个实例中,堆转储大小<100 MB。这背后的原因是什么?

  • 问题内容: JVM运行时数据区为每个正在执行的方法提供单独的堆栈。它包含操作数堆栈和局部变量。每次加载变量时,都需要先到操作数堆栈,然后再到局部变量。为什么不直接操作局部变量表,并进行一些看似重复的工作? 问题答案: 具有直接操作数的指令集必须对每个指令中的操作数进行编码。相反,对于使用操作数堆栈的指令集,操作数是隐式的。 当查看小的琐碎运算(例如将常量加载到变量中)时,隐式参数的优势并不明显。本