一、基本

1. 基本概念

  • 红色部分:会随着虚拟机的启动而创建,随着虚拟机的退出而销毁
  • 灰色部分:与线程一一对应,随着线程的启动和结束,随之产生而结束
  • 一个Runtime, 对应一个JVM虚拟机
    在这里插入图片描述
    在这里插入图片描述

2. 线程

1. 线程是一个程序里的运行单元, JVM允许一个一个应用有多个线程并行执行
2. 每个线程都与操作系统的本地线程直接映射
    2.1 当一个java线程准备好后,此时一个操作系统的本地线程也会创建
    2.2 java线程执行终止后,本地线程也会回收
3. 操作系统负责将线程的安排调度到任何一个可用的cpu上
   一旦本地线程初始化成功,就会调用java线程中的run()

二、程序计数器

1. 概念

  • PC寄存器, PC Register, Program Counter Register, 指令计数器
  • 线程的代码指令:通过程序计数器来进行保存和再次获取,就是用来线程切换
  • 一个线程中会包含一个程序计数器,记录代码指令执行行数,属于线程私有
  • 存储空间比较小,几乎可以忽略不计,也是运行速度最快的
  • 不存在OOM
任何时候一个线程只有一个方法可以执行(当前方法)
存储当前线程正在执行的java方法的jvm指令地址,如果执行native方法,则是undefined

在这里插入图片描述

在这里插入图片描述

三、本地方法栈

1. 本地方法

1. 一个Native Method就是一个java调用非java代码的接口,比如c或c++
  1.1 本地方法: 融合不同的编程语言为java所用,初衷是融合c/c++程序

2. 如何定义
  1.1 定义一个native方法时候,并不提供实现体,因为其实现体是非java语言,在外面实现的
  1.2 和abstract不同,native方法是有实体的,abstract是没有实现体的
  1.3 native和其他关键字都可以组合,但是不能和abstract组合
  1.4 比如Object 中的  public final native Class<?> getClass();

3. 为什么要用
  3.1 某些操作,用java实现起来不方便
  3.2 某些操作,比较在意性能

4. 应用场景

  4.1 Java应用需要与Java外面的环境交互,主要原因(比如操作系统,硬件信息)
      本地方法提供了一个简洁的接口,我们无需了解java应用之外的繁琐的细节

 4.2 与操作系统:
     本身jvm就不是一个完整的操作系统,因此jvm要和操作系统交互

 4.3 sun java
    jvm的组件,解释器等就是用c来实现的

5. 趋势
   随着java的发展,目前使用本地接口的越来越少了,除非要和硬件打交道

2. 本地方法库

  • 将一些本地方法,保存在本地库中

3. 本地方法栈

Java虚拟机栈管理Java方法的调用     本地方法栈管理本地方法的调用

1. 本地方法栈,也是线程私有的
2. 允许被设置为固定或者是可动态扩展的内存大小 (内存溢出方面是和java虚拟机栈是相同的)
3. 本地方法是用c语言实现
4. 具体流程: Native Method Stack 登记 native方法,
     在 Execution Engine执行时加载本地方法库存

在这里插入图片描述

当一个线程调用一个本地方法时, 该线程就进入了一个全新的,不再受虚拟机限制的世界
该线程和虚拟机拥有同样的权限

1. 本地方法可以通过本地方法接口来获取虚拟机内部的运行时数据区
2. 本地方法可以直接使用本地处理器中国呢的寄存器
3. 本地犯法可以i从本地内存的堆中分配任意数量的内存

并不是所有的JVM都支持本地方法
HotSpot JVM中,直接将本地方法栈和虚拟机栈合二为一
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐