JVM学习日记😄内存管理系列之探秘栈

125 阅读2分钟

“这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战

☀️引言

最近看到阿里女下属被性侵的新闻,说实话我很痛心,但比痛心更痛心的是我只是个普通人,什么都做不了,这很像毛泽东早期的状态,想要改变社会,引进新思想、新制度、新文化,由湖南首先完成改变,进而推广到全国。实现了嘛?并没有,不光没有实现,无辜的学生还被强权大肆屠杀,企图镇压这种“不安全”的行为,在强权面前,一切优美的词汇都显得苍白无力。

我觉得没必要杞人忧天,我们党已经很优秀了,我也想爬上去,实地考察一番,但前提是脚踏实地做好现在的事情。

上回说到堆,这回来说说栈。

☀️栈溢出

在hotspot中,栈溢出的参数设置是-xss,《java虚拟机规范》说明:线程请求的最大深度超过栈所允许的深度,就会发生栈溢出,由于hotspot不支持动态扩展,因此不会出现因扩展问题导致的OOM。 为了演示异常,作者做了三点测试,我就不测了都遇到过。

栈的异常情况

  • 虚拟机栈容量小
  • 栈帧太大
  • 线程数量太多

虚拟机栈容量小

这个很好理解,就像我们往杯子里倒啤酒,如果你不限制酒花,那就会自然而然超过杯子的深度溢出,常见的就是递归,递归就是方法调用方法,然后每个方法的调用都伴随着栈的创建,当栈容量太小,或者请求深度太高,就会和我们的酒花一样从杯子中溢出。

image.png

栈帧太大

这个也比较好理解,方法的执行时,线程会为每个方法都创建一个栈帧,栈帧里面有局部变量表、操作数栈和动态链接,当我们栈帧里面的元素占内存大时,会导致栈帧过大,当栈帧内存无法分配时就会造成栈溢出。

线程数量太多

这个也不难理解,操作系统给每个进程的资源是有限的,我们假设就2G内存,那堆要占一部分,程序计数器不说了,没多大,接下来到了方法区,方法区划走了一部分,再去掉直接内存和虚拟机占的内存,剩下的到了虚拟机栈和本地方法栈这里,如果每个线程分配的栈内存足够大,那就只能创建很小的线程。

☀️题外话

愿上天可以怜悯每个受过伤害的弱小心灵,感受到人世间的温暖。