stack guard page for java

JVM通过创建Stack Guard Pages来防止线程栈溢出,当栈超过限制时,会触发mprotect函数设置的保护,引发SIGSEGV信号。JVM注册并处理这个信号,根据在黄色或红色区域来决定抛出异常还是终止程序。此机制确保了线程安全,并优化了性能。
摘要由CSDN通过智能技术生成

jvm 在创建thread的时候会create_stack_guard_pages()来保护我们的线程栈不能超过指定的大小,如果不对栈做限制的话,一旦其超过了为其分配的大小后,将会覆盖后面内存的数据将会产生意想不到的结果,所以jvm使用了stack_guard_pages来做限制。下面以JVM创建 mainThread流程举例(不同的Thread guard page不一样,见倒数第二张图)。看图吧:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述调用mprotect函数使得指定内存区域不能被访问,一旦被访问内核将会发送一个SIGSEGV信号给进程
调用mprotect函数使得指定内存区域不能被访问,一旦被访问内核将会发送一个SIGSEGV信号给进程在这里插入图片描述在jvm启动的时候会注册jvm需要处理的信号其中就包括了SIGSEGV
在这里插入图片描述当jvm接收到相应的信号时会调用JVM_handle_linux_signal函数来处理信号(JVM_handle_linux_signal这是一个非常重要的函数,hotspot很多功能特性都是基于捕获内核信号来实现的(最后一张图)。参考:https://www.oracle.com/java/technologies/javase/signals.html)
在这里插入图片描述这里的处理逻辑分了in_stack_yellow_zone还是in_stack_red_zone (第二张图中第四行代码可以得知gurad page 包含了两部分yellow_zone和red_zone ),如果是in_stack_yellow_zone,只是简单地抛出stack overflow exception,如果是in_stack_red_zone,那么意味着不可恢复的异常,程序会挂掉。下图是stack的内存布局(Creating guard page is very expensive. Java thread has HotSpot
guard page, only enable glibc guard page for non-Java thread)
在这里插入图片描述

https://www.oracle.com/java/technologies/javase/signals.html
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值