java线程栈

我们先总结栈的一些基本概念

1、每个线程运行时所需要的内存,称为虚拟机栈。

2、每个栈由多个栈帧组成,对应着每次方法调用所占用的内存。

3、每个线程只能有一个活动栈,对应着当前正在执行的那个方法。

4、垃圾回收不会设计栈内存,由于栈和栈帧产生的内存无非就是每次方法调用才产生的,而方法调用完成之后就会发生弹栈,内存就会释放出来了,所以无需垃圾回收。

5、-Xss参数来设置栈内存的大小。(一般每个线程初始化的栈内存大小为1M)。

6、增加线程栈的大小,并不会提高程序的运行效率,反而会降低线程的并发数。由于物理内存是有限的,如果物理内存为500M,每个线程栈占用1M,那么可以同时并发500个线程。如果设置每个线程栈的大小为2M,那么线程的并发数量只有250个了。增加线程栈内存的大小,只可以让线程调用更多的方法,创建更多的栈帧。

7、栈帧过多或者栈帧内存过大会导致栈内存溢出。

下面我们通过具体的案例加深对栈的理解:

java线程栈

问:执行上面代码的时候,m1方法里面的变量x会出现线程安全问题吗?

答:不会。由于线程t1和线程t2在运行的时候,会分别创建各自的栈。每个栈里面都会有一个变量x。t1线程执行的时候只会修改t1线程里面的变量x的值。t2线程执行的时候只会修改t2线程里面的变量x的值。它们是没有任何关系的,互不影响的。

java线程栈

问:以上m1方法是线程安全的吗?

答:非线程安全,第一StringBuilder这个类就是非线程安全的,对个线程调用同一个StringBuilder对象的时候就会出现线程安全问题。所以如果我们多个线程调用m1方法的时候,并且传入的是同一个StringBuilder对象就会出现线程安全问题。

java线程栈

模拟栈帧过多导致栈内存溢出

java线程栈

异常信息

以上信息我们可以看出调用了22380次m1方法后,导致了栈内存的溢出了。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容