- 红色部分:会随着虚拟机的启动而创建,随着虚拟机的退出而销毁
- 灰色部分:与线程一一对应,随着线程的启动和结束,随之产生而结束
- 一个Runtime, 对应一个JVM虚拟机
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. 本地方法库
- 将一些本地方法,保存在本地库中
Java虚拟机栈管理Java方法的调用 本地方法栈管理本地方法的调用
1. 本地方法栈,也是线程私有的
2. 允许被设置为固定或者是可动态扩展的内存大小 (内存溢出方面是和java虚拟机栈是相同的)
3. 本地方法是用c语言实现
4. 具体流程: Native Method Stack 登记 native方法,
在 Execution Engine执行时加载本地方法库存
当一个线程调用一个本地方法时, 该线程就进入了一个全新的,不再受虚拟机限制的世界
该线程和虚拟机拥有同样的权限
1. 本地方法可以通过本地方法接口来获取虚拟机内部的运行时数据区
2. 本地方法可以直接使用本地处理器中国呢的寄存器
3. 本地犯法可以i从本地内存的堆中分配任意数量的内存
并不是所有的JVM都支持本地方法
HotSpot JVM中,直接将本地方法栈和虚拟机栈合二为一
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)