JVM运行时数据区

JVM运行时数据区,第1张

一、基本 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中,直接将本地方法栈和虚拟机栈合二为一

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/737095.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存