JVM 本地方法接口、本地方法栈

本地方法栈是Java虚拟机的一部分,主要负责非Java方法的调用,比如线程管理和操作系统交互。本地方法栈与虚拟机栈类似,但为本地方法服务。HotSpot虚拟机中,两者并未区分,栈溢出主要由-Xss参数控制。当线程请求的栈深度超过最大限制或扩展失败时,会抛出StackOverflowError或OutOfMemoryError异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本地方法

        一个Native Method就是一个java调用一个非java方法的接口。该方法的实现是非java实现
        如:getClass()、对于线程的操作方法(因为要转为操作系统线程)

为什么使用本地方法

        1、调用非java代码,需要与java外面的环境进行交互
        2、与操作系统的交互

本地方法栈

本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。

        《Java虚拟机规范》对本地方法栈中方法使用的语言、使用方式与数据结构并没有任何强制规
定,因此具体的虚拟机可以根据需要自由实现它,甚至有的Java虚拟机(譬如Hot-Spot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈也会在栈深度溢出或者栈扩展失败时分别抛出StackOverflowError和OutOfMemoryError异常

本地方法栈溢出

        由于HotSpot虚拟机中并不区分虚拟机栈和本地方法栈,因此对于HotSpot来说,-Xoss参数(设置本地方法栈大小)虽然存在,但实际上是没有任何效果的,栈容量只能由-Xss参数来设定。关于虚拟机栈和本地方法栈,在《Java虚拟机规范》中描述了两种异常:
        1)如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。
        2)如果虚拟机的栈内存允许动态扩展,当扩展栈容量无法申请到足够的内存时,将抛出
OutOfMemoryError异常。
        而HotSpot虚拟机的选择是不支持扩展,所以除非在创建线程申请内存时就因无法获得足够内存而出现OutOfMemoryError异常否则在线程运行时是不会因为扩展而导致内存溢出的,只会因为栈容量无法容纳新的栈帧而导致StackOverflowError异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值