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)来完成
0 0
原创粉丝点击