JVM:线程栈(Thread Stack)占用内存么?

你好,我是风一样的树懒,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。

点击下方👇关注公众号,带你一起复习后端技术,看看面试考点,补充积累技术知识,每天都为面试准备积累

文章可能会比较长,主要解析的非常详解,或涉及一些底层知识,供面试高阶难度用。可以根据自己实际理解情况合理取舍阅读


线程栈(Thread Stack)是每个线程在运行时分配的一部分内存,用于存储线程的局部变量、方法调用信息等数据。每个线程都会有自己的栈空间,因此线程栈的内存使用量会随着线程数的增加而增加。

线程栈内存的计算:

默认线程栈大小:JVM中的每个线程会默认分配一个栈空间,这个大小依赖于JVM的配置和操作系统的默认设置。例如,在JVM中,默认的线程栈大小通常为 1MB 到 1MB - 2MB(具体数值可以根据JVM和操作系统的不同而变化)。


JVM参数:你可以通过 -Xss 参数来设置每个线程栈的大小。例如,-Xss256k 表示每个线程使用 256KB 的栈空间。


线程数:线程栈的内存使用量是 每个线程的栈大小 乘以 当前JVM中活跃的线程数。


例子:

假设:

  • 每个线程的栈大小为 1MB(默认值)。

  • JVM中有 100个线程。

那么,线程栈的总内存使用量就是:

  • 线程栈总内存 = 1MB × 100线程 = 100MB。


计算线程栈内存使用时需要考虑的因素:

线程数:随着线程数的增加,线程栈的内存使用会呈线性增长。假设每个线程栈的大小为 X,那么如果有 Y 个线程,线程栈使用的内存为 X * Y。


栈大小配置:你可以根据需要通过 -Xss 来设置每个线程的栈大小。比如,如果线程栈的大小设置为 -Xss512k,那么每个线程会使用 512KB 的内存。


JVM和操作系统默认值:JVM默认的线程栈大小根据不同的JVM和操作系统可能会有所不同,通常在 256KB 到 1MB 之间。


计算示例:

假设你通过 -Xss512k 设置了每个线程的栈大小,并且当前JVM有 500个线程。那么线程栈的内存使用量就是:

  • 线程栈总内存 = 512KB × 500 = 256MB。


注意:

  1. 线程栈是每个线程独立的,因此它与堆内存不同,堆内存的大小只与 堆内存的总大小 相关,而线程栈是与 线程数量 紧密相关的。

  2. 如果有大量线程(例如数千个线程),线程栈的内存消耗可能会很大。因此,在配置线程栈时,务必要考虑线程数量,以避免内存溢出问题。


总结:

线程栈的大小由 -Xss 参数控制,每个线程的栈大小是固定的(除非你修改了JVM设置)。

线程栈的总内存使用量 = 线程栈的单个大小 × 当前JVM线程数量。

今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!

END


扫码关注

一起积累后端知识
不积跬步,无以至千里
不积小流,无以成江海

喜欢此内容的人还喜欢

《Java面试题指南》回归啦~


一个阿里二面面试官必问的问题


Lambda表达式说爱你不容易


分享面试:mysql数据库索引失效的情况


Spring-Boot中一个不起眼的好工具StopWatch