JVM栈以及其对线程并发量的影响

JVM栈

​根据JVM规范,JVM包括两种栈,java虚拟机栈和本地方法栈。也就是说,每当启动一个java线程时,JVM就会为其分配一个java虚拟机栈和一个本地方法栈。栈对线程而言是独立私有内存区域,线程间无法对栈进行互访,这由虚拟机保证。如下图:

​java虚拟机栈在老的规范中描述为java栈,顾名思义,是为java方法即java 字节码方法调用服务的栈。如同C栈,每当java线程调用java方法时,JVM会向java虚拟机栈压入新的栈帧,该栈帧成为当前帧,用来存储局部变量,中间运算值等数据。

​本地方法栈是为本地方法调用服务的栈,如通过JNI、JNA接口实现的本地方法调用,方法栈具体是什么类型由本地方法接口的实现决定,如其采用C链接模型,那么本地方法栈就是C栈。JVM规范并没有对本地方法栈使用的语言、数据结构进行强制规定,由具体虚拟机实现决定。当线程调用本地方法时,java虚拟机栈并不会改变,JVM只是动态链接和调用本地方法,由本地方法栈完成本地方法的压栈出栈。

JVM栈对线程并发量的影响

​由上可知,JVM会为每个线程分配虚拟机栈和本地方法栈,但受资源的约束线程数是无法无限增长的,这除了操作系统设置的影响外,JVM栈大小对JVM能创建的线程数也有间接影响。

​ 操作系统为每个进程分配的内存是有限的,在粗略计算下,抛开其它小的消耗,分配给JVM进程的内存减去JVM堆、方法区、基本就是栈区所能使用的最大内存了。如win32下,一个JVM最大内存是2G,如果分配给堆和方法区1G,剩下1G是栈区所能使用的内存,每创建一个线程就需要分配一定的栈内存给线程,线程数必然可尽。

​创建新线程无法申请到足够栈内存,容易出现内存溢出错误,或者JVM崩溃。这常出现在小内存,大并发线程量的应用中。如下的虚拟机崩溃问题也许似曾相识:

#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 133419008 bytes for committing reserved memory.
# Possible reasons:
#   The system is out of physical RAM or swap space
#   In 32 bit mode, the process size limit was hit
# Possible solutions:
#   Reduce memory load on the system
#   Increase physical memory or swap space
#   Check if swap backing store is full
#   Use 64 bit Java on a 64 bit OS
#   Decrease Java heap size (-Xmx/-Xms)
#   Decrease number of Java threads
#   Decrease Java thread stack sizes (-Xss)
#   Set larger code cache with -XX:ReservedCodeCacheSize=
# This output file may be truncated or incomplete.
#

这样的应用很常见,尤其是把服务架设在云服务器上用几十块钱一个月的机器当服务器的初创团队。

​除了可以在服务器资源投入上解决问题外,依然可以在现有的有限条件下解决问题:一是降低其他内存区的内存占用量,如堆区,二是采用workaround,任务调度方案,减少并发执行量,另一个很少受到关注的方法是调整java线程栈的大小。

​-Xss可用来设置JVM单个线程的栈大小,该参数不带单位时指字节,后面可以带k或K,m或M,g或G等单位,分别表示KB、MB、GB。JDK5以后每个java线程的栈内存默认是1024KB,即1M,1G的JVM栈最多支持1024个线程。如果应用中并无很深的调用,根据应用的特点降低JVM栈大小也是能达到较大的线程并发量,如-Xss256m。这样1G的栈内存可支持4*1024个线程。另外,需要补充说明的是,Hotspot做为主流JVM,其实现是将java虚拟机栈和本地方法栈合二为一,因此,如Xoss针对本地方法区大小设置是无效的。

参考

​ 深入理解Java虚拟机 周志明

​ 深入Java虚拟机 Bill Venners

​ Java虚拟机规范8 https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.6

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345