本地方法栈
当一个线程调用native方法时,它就进入了一个不受java虚拟机限制的世界。它可以使用本地处理器的寄存器,在任何数量的本地堆上分配内存或者使用任意类型的栈。
本地方法接口会使用某种类型的本地方法栈,当线程调用java方法时,虚拟机创建一个帧并把它push到java栈中,当线程调用natvie方法时,线程不会将新的帧push到线程的java栈中,java虚拟机会只是动态连接到native方法并直接调用它。
一个本地方法可能会调用一个java方法,在这种情况下,线程会离开本地方法栈并且进入另一个java栈中。下图描述了线程调用一个native方法,然后在native方法中回调另一个java方法。
上图中,线程调用了两个java方法,第二个java方法调用了一个native方法。这个动作会引起虚拟机使用一个本地方法栈,在这个图中,本地方法栈以一个有限数量的连续内存空间呈现。假定他是一个c栈,每个c链接函数用以灰色呈现,并且以虚线作为分割。第一个c链接函数作为一个native方法被调用,它调用了另一个c链接函数。第二个c链接函数通过native方法接口调用了java方法。然后这个java方法又调用了另一个java方法,也就是图中所示的当前方法。