我们都知道java虚拟机所管理的内存区域包括方法区,堆,虚拟机栈,本地方法栈,程序计数器。

在《深入理解java虚拟机》中,周志明老师对虚拟机栈进行了讲解,但是对本地方法栈却一笔带过。今天我们就来对本地方法栈做下深入......

首先我们先回顾一下虚拟机栈。

1.虚拟机栈

1.1虚拟机栈的特点

虚拟机栈是线程私有的,它的生命周期与线程相同。

1.2虚拟机栈的概念

虚拟机栈是java方法执行的线程内存模型:每个java方法在执行时都会创建一个“栈帧”,栈帧的结构分为“局部变量表,操作数栈,动态链接,方法出口”几个部分。栈帧中的局部变量表存放着一个方法的所有局部变量。

对于java类中的方法来说:方法调用时,创建栈帧,并压入虚拟机栈;方法执行完毕,栈帧出栈并销毁。

1.3关于虚拟机栈的异常

单个线程请求的栈深度大于虚拟机允许的深度,则会抛出StackOverflowError;

当整个虚拟机栈内存耗尽时,无法再申请到内存会抛出OutOfMemoryError;

2.本地方法栈

虚拟机栈服务于java方法,本地方法栈服务于Native方法。

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文件,打印结果。

从本地方法栈看到jni调用的更多相关文章

  1. 【JVM第三篇--运行时数据区】程序计数器、虚拟机栈、本地方法栈

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.运行时数据区 我们在编写Java程序时,使用JVM的流程主要如下所示: 虚拟机在 ...

  2. JVM的本地方法栈

    对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区.当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界.本地方法可以通过本地方法接口来访问虚拟机的运行 ...

  3. 从几个sample来学习JAVA堆、方法区、JAVA栈和本地方法栈

    最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程,大部分的程序员在写程序时不会太关注Java运行时数据区域的结构: 感觉有 ...

  4. Java虚拟机栈和本地方法栈

    Java虚拟机栈的特征 线程私有 后进先出(LIFO)栈 存储栈帧,支持Java方法的调用.执行和退出 可能出现OutOfMemoryError异常和StackOverflowError异常 Java ...

  5. 02-JVM内存模型:虚拟机栈与本地方法栈

    一.虚拟机栈(VM Stack) 1.1)什么是虚拟机栈 虚拟机栈是用于描述java方法执行的内存模型. 每个java方法在执行时,会创建一个“栈帧(stack frame)”,栈帧的结构分为“局部变 ...

  6. JVM体系结构之五:本地方法栈

    对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区.当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界.本地方法可以通过本地方法接口来访问虚拟机的运行 ...

  7. JVM本地方法栈及native方法

    看到虚拟机栈和本地方法栈的区别的时候有点疑惑,因为本地方法栈为虚拟机的Native方法服务.以下转载一篇关于native方法的介绍: http://blog.csdn.net/wike163/arti ...

  8. JVM 运行时数据区:程序计数器、Java 虚拟机栈和本地方法栈,方法区、堆以及直接内存

    Java 虚拟机可以看作一台抽象的计算机,如同真实的计算机,它也有自己的指令集和运行时内存区域. Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存(运行时内存区域)划分为若干个不同的数 ...

  9. JVM方法栈的工作过程,方法栈和本地方法栈有什么区别。

    JVM的本地方法栈   对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区.当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界.本地方法可以通过本地方 ...

随机推荐

  1. HTTP协议 有这篇文章足够了

    HTTP 协议详解 HTTP(HyperText Transfer Protocol)超文本传输协议.其最初的设计目的是为了提供一种发布和接收HTML页面的方法. HTTP是一个客户端(用户)和服务端 ...

  2. 使用thymeleaf模板实现博客评论的异步刷新

    使用thymeleaf模板实现博客评论的异步刷新 最简单的一个要求:用户可以在博客下面进行评论,然后评论后点击提交后直接上传到数据库,并且局部刷新 这是前端页面的展示,使用的semanticUI进行构 ...

  3. Linux命令学习神器!命令看不懂直接给你解释!

    大家都知道,Linux 系统有非常多的命令,而且每个命令又有非常多的用法,想要全部记住所有命令的所有用法,恐怕是一件不可能完成的任务. 一般情况下,我们学习一个命令时,要么直接百度去搜索它的用法,要么 ...

  4. 使用IDEA创建Maven整合SSM

    创建数据库 CREATE DATABASE `ssmbuild`; USE `ssmbuild`; DROP TABLE IF EXISTS `books`; CREATE TABLE `books` ...

  5. JUC-八锁现象和不安全锁

    1,被 synchronized 修饰的方法,锁的对象是方法的调用者(实例对象) 2,被 static 修饰的方法,锁的对象就是 Class模板对象,这个则全局唯一 问题7: 一个普通同步方法,一个静 ...

  6. CSS3实现一个旋转的花朵

    要效果图如下: 实现原理:其实很简单,就是中间的圆圈定位在中间,其他的6个圆圈,进行不同的绝对定位,然后进行旋转!代码: <!DOCTYPE html> <html lang=&qu ...

  7. 关于 服务器ip和域名进行一个绑定

    最近想让人访问我做个一个网站,但是我发现让服务器ip地址直接暴露不是很好 (做着玩) 于是就去阿里云买了一个5块1年的域名 先在网上百度了一下是怎么绑定域名的,发现全是含糊不清的信息,果然是垃圾百度 ...

  8. CentOS安装docker ce的三种方式

    参考文章: CentOS安装docker ce的三种方式: 1.环境 CentOS Linux release 7.6.1810 (Core) 2.卸载旧版本 sudo yum remove dock ...

  9. go源码分析(二) 使用go http包开发web时遇到的坑之重复注册Handle路由

    我们使用Handle注册http时 如果添加两行,即重复注册函数. http.HandleFunc("/",index) http.HandleFunc("/" ...

  10. php 数据库 操作

    header.php <?php error_reporting(0);//加上error_reporting(0);就不会弹出警告了 // header("Content-type: ...