Pre
之前的文章,我们分析了Metaspace区域是如何内存溢出的,同时还带着大家分析了一下内存快照。
今天这篇文章,我们就带大家分析一下JVM栈内存溢出的时候,怎么来解决。
栈内存溢出能依托之前的办法解决吗?
首先大家思考一个问题:栈内存溢出能按照之前的方法解决吗?
也就是说,GC日志、内存快照,这些东西对解决栈内存溢出有帮助吗?
首先明确一点,栈内存溢出跟堆内存是没有关系的,因为他的本质是一个线程的栈中压入了过多方法调用的栈桢,比如几千次方法调用的几千个栈桢。
此时就导致线程的栈内存不足,无法放入更多栈桢了。
所以GC日志对你有用吗?
没用!因为GC日志主要是分析堆内存和Metaspace区域的一些GC情况的,就线程的栈内存和栈桢而言,他们不存在所谓的GC。
如果大家还记得之前我们画的图,就应该知道,调用一个方法时在栈里压入栈桢,接着执行完整个方法,栈桢从栈里出来,然后一个线程运行完毕时,他的栈内存就没了。
所以本身这块内存不存在所谓的GC和回收,调用方法就给栈桢分配内存,执行完方法就回收掉那个栈桢的内存。
那么内存快照呢?
内存快照主要是分析一些内存占用的,同样是针对堆内存和Metaspace的,所以对线程的栈内存而言,也不需要借助这个东西。
Code
使用的JVM参数如下:
-XX:ThreadStackSize=1m
-XX