我们都知道java虚拟机所治理的内存区域包罗方式区,堆,虚拟机栈,内陆方式栈,程序计数器。
在《深入明白java虚拟机》中,周志明先生对虚拟机栈进行了解说,然则对内陆方式栈却一笔带过。今天我们就来对内陆方式栈做下深入……
首先我们先回首一下虚拟机栈。
1.虚拟机栈
1.1虚拟机栈的特点
虚拟机栈是线程私有的,它的生命周期与线程相同。
1.2虚拟机栈的观点
虚拟机栈是java方式执行的线程内存模子:每个java方式在执行时都市建立一个“栈帧”,栈帧的结构分为“局部变量表,操作数栈,动态链接,方式出口”几个部门。栈帧中的局部变量表存放着一个方式的所有局部变量。
对于java类中的方式来说:方式挪用时,建立栈帧,并压入虚拟机栈;方式执行完毕,栈帧出栈并销毁。
1.3关于虚拟机栈的异常
单个线程请求的栈深度大于虚拟机允许的深度,则会抛出StackOverflowError;
当整个虚拟机栈内存耗尽时,无法再申请到内存会抛出OutOfMemoryError;
2.内陆方式栈
虚拟机栈服务于java方式,内陆方式栈服务于Native方式。
开发一个健壮的npm包
2.1那么作甚Native方式?
实在Native方式是一个用native关键字修饰的方式,它实质上就是一个java挪用其它语言的接口(像挪用C,C++等)。
看到这里想到了什么?JNI挪用的时刻就是依托于Native方式。
2.2为什么会有native方式
①只管java很好用,然则效率上不如c和c++
②java需要和底层操作系统或者和硬件交互
3.用native的方式实现jni
(这并不是我们在Android开发中使用的方式,然则原理上是相同的)
3.1 编写我们的Native方式,建立MyNative.java文件
public class MyNative {
public static native String myPrint();
static {
System.loadLibrary("print");
}
public static void main(String[] args){
new MyNative().myPrint();
}
}
3.2 编译.java文件,天生字节码文件
3.3 获取.h文件
通过javah -jni MyNative就会发生一个MyNative.h文件。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class MyNative */
#ifndef _Included_MyNative
#define _Included_MyNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: MyNative
* Method: myPrint
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_MyNative_myPrint
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
3.4编写print.cpp文件
#include 'MyNative.h'
JNIEXPORT jstring JNICALL Java_MyNative_myPrint
(JNIEnv *env, jclass jobj)
{ return env->NewStringUTF("hellonative");
}
编译后天生dll文件
3.5 运行MyNative文件,打印效果。
原创文章,作者:28x29新闻网,如若转载,请注明出处:https://www.28x29.com/archives/3839.html