jvm虚拟机学习笔记(一)---总体认识
来源:互联网 发布:淘宝分销和代销哪个好 编辑:程序博客网 时间:2024/05/06 18:26
jvm虚拟机
java的执行过程:
java源代码-->通过compiler编译后变成.class文件-->通过类加载器将class文件加载载入到系统分配给JVM的内存区域运行数据区(Runtime Data Areas).-->执行引擎解释或者编译类文件,转化成特定CPU的机器码-->CPU执行机器码,至此完成整个过程。
一、类加载器:
1、层级关系:
Bootstrap ClassLoader :当运行java虚拟机时,这个类加载器被创建,它加载一些基本的java API,包括Object这个类。这个类加载器不是用java语言写的,而是用C/C++写的
|
|
Extension Class Loader:加载API之外的一些扩展类
|
|
System Class Loader:加载应用程序中的类,classPath下配置的类
|
|-User Defined Class Loader :开发人员通过扩展ClassLoader的自定义加载类
|
|--User Defined Class Loader
|
|_User Defined Class Loader
2、加载模式:
采用委派模式进行加载,当jvm开始加载类的时候,会委托给上一级加载器进行加载,如果上一级已经加载过,则直接使用这个类,若无,则继续往上委托加载。
检查完了之后,会按照相反的顺序进行加载,如果顶级bootstrap找不到这个类,则继续往下委托,直至找到类文件.
二、运行数据区域(Runtime Data Areas)
1、运行数据区域划分:
每个线程独享:java虚拟栈、程序计数寄存器、本地方法栈
整个程序共享:java堆、方法区域、运行常量池(存在方法区域内)
2、区域介绍:
A.程序计数寄存器:
线程启动,pc计数器开始创建,记录正在执行的字节码指令
B.java虚拟栈:
线程启动,java虚拟栈创建,虚拟栈里面存放一系列的栈桢,jvm只能压入和弹出栈桢,每当一个方法被调用,则被压入一个栈桢,方法调用完毕,则弹出栈桢;
每一个栈桢中都包含三个部分:本地变量数组、操作数栈、方法所属类的常量池引用
本地变量数组:存放方法值引用、传递的参数、局部变量
操作数栈:存放执行方法的时候的中间变量,操作数栈才是方法真正执行的地方
常量池引用:当需要使用到常量池的东西的时候,通过这个引用来访问常量池
C.本地方法栈:
程序通过JNI(Java Native Interface)调用本地方法建立的栈
D.方法区域:
jvm实例启动时创建,供所有线程共享,存放有关域、方法的信息、静态变量、类和方法的字节码、运行常量池
E.运行常量池
存放类和接口的常量,还存放方法和域的所有引用
F.java堆:
存放程序创建的对象或者实例
三、执行引擎
类加载器将字节码载入内存之后,执行引擎以Java 字节码指令为但愿,读取Java字节码。问题是,现在的java字节码机器是读不懂的,因此还必须想办法将字节码转化成平台相关的机器码。这个过程可以由解释器来执行,也可以有即时编译器(JIT Compiler)来完成
java的执行过程:
java源代码-->通过compiler编译后变成.class文件-->通过类加载器将class文件加载载入到系统分配给JVM的内存区域运行数据区(Runtime Data Areas).-->执行引擎解释或者编译类文件,转化成特定CPU的机器码-->CPU执行机器码,至此完成整个过程。
一、类加载器:
1、层级关系:
Bootstrap ClassLoader :当运行java虚拟机时,这个类加载器被创建,它加载一些基本的java API,包括Object这个类。这个类加载器不是用java语言写的,而是用C/C++写的
|
|
Extension Class Loader:加载API之外的一些扩展类
|
|
System Class Loader:加载应用程序中的类,classPath下配置的类
|
|-User Defined Class Loader :开发人员通过扩展ClassLoader的自定义加载类
|
|--User Defined Class Loader
|
|_User Defined Class Loader
2、加载模式:
采用委派模式进行加载,当jvm开始加载类的时候,会委托给上一级加载器进行加载,如果上一级已经加载过,则直接使用这个类,若无,则继续往上委托加载。
检查完了之后,会按照相反的顺序进行加载,如果顶级bootstrap找不到这个类,则继续往下委托,直至找到类文件.
二、运行数据区域(Runtime Data Areas)
1、运行数据区域划分:
每个线程独享:java虚拟栈、程序计数寄存器、本地方法栈
整个程序共享:java堆、方法区域、运行常量池(存在方法区域内)
2、区域介绍:
A.程序计数寄存器:
线程启动,pc计数器开始创建,记录正在执行的字节码指令
B.java虚拟栈:
线程启动,java虚拟栈创建,虚拟栈里面存放一系列的栈桢,jvm只能压入和弹出栈桢,每当一个方法被调用,则被压入一个栈桢,方法调用完毕,则弹出栈桢;
每一个栈桢中都包含三个部分:本地变量数组、操作数栈、方法所属类的常量池引用
本地变量数组:存放方法值引用、传递的参数、局部变量
操作数栈:存放执行方法的时候的中间变量,操作数栈才是方法真正执行的地方
常量池引用:当需要使用到常量池的东西的时候,通过这个引用来访问常量池
C.本地方法栈:
程序通过JNI(Java Native Interface)调用本地方法建立的栈
D.方法区域:
jvm实例启动时创建,供所有线程共享,存放有关域、方法的信息、静态变量、类和方法的字节码、运行常量池
E.运行常量池
存放类和接口的常量,还存放方法和域的所有引用
F.java堆:
存放程序创建的对象或者实例
三、执行引擎
类加载器将字节码载入内存之后,执行引擎以Java 字节码指令为但愿,读取Java字节码。问题是,现在的java字节码机器是读不懂的,因此还必须想办法将字节码转化成平台相关的机器码。这个过程可以由解释器来执行,也可以有即时编译器(JIT Compiler)来完成
0 0
- jvm虚拟机学习笔记(一)---总体认识
- jvm学习笔记(一)—Java虚拟机内存区域
- JVM学习--认识虚拟机
- Java学习笔记(一)之―认识JDK、JRE、JVM
- JVM学习笔记(1)-虚拟机内存
- JVM学习笔记(一)
- jvm学习笔记(一)
- JVM学习笔记(一)
- JVM学习笔记(一)
- JVM学习笔记(一)
- 【JVM规范笔记一】JVM虚拟机结构
- Java虚拟机JVM学习笔记
- libevent学习笔记一:总体把握
- jquery源码学习笔记一:总体结构
- jvm学习笔记(一)
- JVM学习笔记一
- jvm学习笔记一
- WinDbg学习笔记(一)--认识WinDbg
- ZOJ-3782-Ternary Calculation【11th浙江省赛】
- 2015年终总结--不忘初心
- Java基础(函数、数组)
- 面试题之二海贼分宝石
- android.media.MediaRecorder.start(Native Method) 报错:start failed: -19
- jvm虚拟机学习笔记(一)---总体认识
- Android 命名规范 (提高代码可以读性)
- Android开发中遇到的问题记录
- 【poj1905】Expanding Rods——二分
- 机试练习 北理14年01、02题 打开文件顺序
- HTTP无状态协议和Connection:Keep-Alive容易犯的误区
- 进程与线程
- 动画研究 一
- chrome dev tools