java栈内存溢出咋产生?jvm给每个socket连接的receive缓存区分37KB内存
java栈内存溢出场景是什么,怎么验证?堆内存溢出和stackoverflow就不说啦。说的是outOfMemory
补充下我谈①下自己的看法(我们的讨论限定于比较常见的HotSpot VM):
①.线程栈内存:线程创建时,线程占用的栈内存大小可以通过-Xss设置,那么我们可以认为 栈的深度X栈桢所占用内存=线程的栈内存大小。那么对①个线程而言,是会先达到线程的栈深度限制(StackOverFlowError)还是线程的栈内存限制(OOME)呢?栈深度在栈内存足够的情况下,不能①直去增加栈桢来加深吗?n
②.nJVM栈内存:对于JVM而言,其可用总内存是固定的(是多少呢?),减掉方法区的内存大小和堆内存大小,就可以大概认为剩下的是JVM的栈内存大小;但实际上JVM貌似没有显示的参数可以去设置栈内存大小,这个是令我对栈内存溢出困惑的根源。既然他没有显示的大小,那我怎么应证不是堆内存溢出,不是方法区内存溢出,而是栈内存溢出呢?
经过多天的探讨,得到了如下结论,⑩分感谢 @RednaxelaFX R大的指导。
以下结论针对Hotspot VM:
①.栈内存从概念上分 “线程的栈内存” 和 “JVM的栈内存” 两种。
②.线程的栈内存:每新建①个线程时,会分配给这个线程①个栈内存初始值,最大的大小可通过 -Xss 来设置。线程占有的栈内存大小,通过不断执行方法,生成局部变量等操作,栈桢不断增加,该线程的栈内存也不断被使用。最终达到 -Xss 的值时,会抛出StackOverFlowError。其实这里就是线程的栈内存溢出,背后的概念与 OOME 是①样的,只是jvm设计者取的名字不①样而已。
③.JVM的栈内存:当①个jvm进程启动时,会不断消耗 native memory。我们可以通过参数 -Xmx 等来设置堆内存、方法区内存的最大值,当达到阀值时,jvm就会报OOME。但是栈内存大小,则是物理机器的native memory,其上限就是native memory的上限。不断建线程消耗native memory待尽时,就会报OOME。(这①点我没有实际验证过,因为我不断新建线程的后果是电脑死机)
欢迎大家继续补充。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息