JVM原理机制笔记

1.JVM 简介

JVM 全称是Java Virtual Machine ,Java 虚拟机,也就是在计算机上再虚拟一个计算机。

这和我们使用 VMWare 不一样,那个虚拟的东西你是可以看到的,这个JVM 你是看不到的,它存在内存中

计算机的基本构成是:运算器、控制器、存储器、输入和输出设备。

JVM 也是有这成套的元素:

运算器 -当然是交给硬件CPU 还处理了

      为了适应“一次编译,随处运行”的情况,需要做一个翻译动作,于是就用了JVM 自己的命令集。

这与汇编的命令集有点类似,每一种汇编命令集针对一个系列的CPU ,

比如8086 系列的汇编也是可以用在8088 上的,但是就不能跑在8051 上。

JVM 的命令集则是可以到处运行的,因为JVM根据不同的CPU ,翻译成不同的机器语言。

存储器 - JVM 是一个内存中的虚拟机,那它的存储器就是内存了。

                     我们写的所有类、常量、变量、方法都在内存中。

2.JVM的组成部分

JVM 是运行在操作系统之上的,它与硬件没有直接的交互:

 

JVM 构成图,整个JVM 分为四部分:

1)      Class Loader 类加载

类加载器的作用是加载类文件到内存,

比如编写一个HelloWord.java 程序,然后通过javac 编译成class 文件,

那怎么才能加载到内存中被执行呢?Class Loader 承担的就是这个责任。

Class Loader 只管加载,只要符合文件结构就加载,

至于说能不能运行,则不是它负责的,那是由Execution Engine 负责的。

2)      Execution Engine 执行引擎

也叫做解释器(Interpreter) ,负责解释命令,提交操作系统执行。

3)      Native Interface 本地接口

本地接口的作用是融合不同的编程语言为Java 所用,它的初衷是融合C/C++ 程序

目前该方法使用的已经比较少见了,因为现在的异构领域间的通信很发达,

比如可以使用Socket 通信,也可以使用Web Service 等等

4)      Runtime data area 运行数据区

运行数据区是整个JVM 的重点。我们所有写的程序都被加载到这里,之后才开始运行

                整个JVM 框架由加载器加载文件,然后执行器在内存中处理数据,需要与异构系统交互是可以通过本地接口进行,一个完整的系统诞生了。

 

3.JVM加载class文件的原理机制

1. Java中的所有类,必须被装载到jvm中才能运行。

这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中。

2. Java中的类大致分为三种:

1) 系统类

2) 扩展类

3) 由程序员自定义的类

3. 类装载方式,有两种:

1) 隐式装载。 程序在运行过程中当碰到通过new 等方式生成对象时,

隐式调用类装载器加载对应的类到jvm中。

2) 显式装载。 通过class.forname()等方法,显式加载需要的类。

隐式加载与显式加载的区别:

4.类加载的动态性体现:

一个应用程序总是由n多个类组成,Java程序启动时,并不是一次把所有的类全部加载后再 运行.

它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载.

这样的好处是节省了内存的开销.

5. Java类装载器:

Java中的类装载器实质上也是类,功能是把类载入jvm中.

值得注意的是jvm的类装载器并不是一个,而是三个。

为什么要有三个类加载器,一方面是分工,各自负责各自的区块,另一方面为了实现委托模

Bootstrap Loader                                   - 负责加载系统类(用C++语言写的)            搜索路径:sun.boot.class.path

|

ExtClassLoader                  - 负责加载扩展类                                        搜索路径:java.ext.dirs

|

AppClassLoader  - 负责加载应用类                                       搜索路径:java.class.path

 

6. 类加载器之间是如何协调工作的:

在这里java采用了委托模型机.

类装载器有载入类的需求时,会先请示其Parent使用其搜索路径帮忙载入,

如果Parent 找不到,那么才由自己依照自己的搜索路径搜索类。

7. 预先加载(pre-loading)与依需求加载(load-on-demand):

1)在 JRE 运行的开始会将 Java 运行所需要的基本类采用预先加载( pre-loading )的方法全部加载要内存当中.

主要包括 JRE 的 rt.jar 文件里面所有的 .class 文件

2) 当 java.exe 虚拟机开始运行以后,它会找到安装在机器上的 JRE 环境,然后把控制权交给 JRE .

JRE 的类加载器会将 lib 目录下的 rt.jar 基础类别文件库加载进内存.

3) 相对于预先加载,我们在程序中需要使用自己定义的类的时候就要使用依需求加载方法

( load-on-demand ),就是在 Java 程序需要用到的时候再加载,以减少内存的消耗.

8.自定义类加载机制:

一般我们都是调用系统的 类加载器来实现加载的,其实我们是可以自己定义类加载器的。

利用 Java 提供的 java.net.URLClassLoader 类就可以实现。

try {

URL url = new  URL( "file:/d:/test/lib/" );

URLClassLoader urlCL = new  URLClassLoader( new  URL[]{url});

Class c = urlCL.loadClass("TestClassA" );

TestClassA object = (TestClassA)c.newInstance();

object.method();

}catch (Exception e){

e.printStackTrace();

}

9.类加载器的阶层体系:

1)Java 的类加载器工作原:

当执行 java ***.class 的时候, java.exe 会帮助我们找到 JRE

接着找到位于 JRE 内部的 jvm.dll ,这才是真正的 Java 虚拟机器

最后加载动态库,激活 Java 虚拟机器

虚拟机器激活以后,会先做一些初始化的动作,比如说读取系统参数等。

一旦初始化动作完成之后,就会产生第一个类加载器―― Bootstrap Loader

Bootstrap Loader 是由 C++ 所撰写而成

Bootstrap Loader 所做的初始工作中,除了一些基本的初始化动作之外,

最重要的就是加载 Launcher.java 之中的 ExtClassLoader ,并设定其 Parent 为 null

代表其父加载器为 BootstrapLoader

然后 Bootstrap Loader 再要求加载 Launcher.java 之中的 AppClassLoader

并设定其 Parent 为之前产生的 ExtClassLoader 实体

*Launcher$ExtClassLoader.class 与 Launcher$AppClassLoader.class 都是由 Bootstrap Loader 所加载

所以 Parent 和由哪个类加载器加载没有关系

2)类加载器之间的关系

BootstrapLoader <---(Extends)----AppClassLoader <---(Extends)----ExtClassLoader

这三个加载器就构成我们的 Java 类加载体

 

  3) 他们分别从以下的路径寻找程序所需要的类:

BootstrapLoader : sun.boot.class.path
ExtClassLoader:         java.ext.dirs
AppClassLoader:       java.class.path

这三个系统参量可以通过 System.getProperty() 函数得到具体对应的路径。

时间: 2024-10-13 14:03:22

JVM原理机制笔记的相关文章

JVM原理学习笔记

最近在阅读 <Inside the JVM> 这本书,结合一些日常工作学习中的感想,随便写一些东西,蜻蜓点水,不必有章法. 关于“单例同步”:     一直有人在问单例对象的并发调用是否需要同步,基本属于“月经帖”了,答案是现成的满天下都是,但真正能让人心里踏实下来的解释寥寥无几.实际上,只要学习了一些JVM的运行原理,解释这个问题就不难了.     如果一个类是单例的,比如某些DAO的设计,那么所有的线程来访问这个类的实例的时候,它们获得的都将是同一个对象,这是不言自明的.如果这些线程的当前

JVM加载class文件的原理机制

JVM加载class文件的原理机制 1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的, 类装载器所做的工作实质是把类文件从硬盘读取到内存中 2.java中的类大致分为三种:     1.系统类     2.扩展类     3.由程序员自定义的类 3.类装载方式,有两种     1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中,     2.显式装载, 通过class.forname()等方法,

Java提高篇——JVM加载class文件的原理机制

1.JVM 简介 2.JVM 的组成部分 3.JVM加载class文件的原理机制 在面试java工程师的时候,这道题经常被问到,故需特别注意. 回到顶部 1.JVM 简介 JVM 是我们Javaer 的最基本功底了,刚开始学Java 的时候,一般都是从“Hello World ”开始的,然后会写个复杂点class ,然后再找一些开源框架,比如Spring ,Hibernate 等等,再然后就开发企业级的应用,比如网站.企业内部应用.实时交易系统等等,直到某一天突然发现做的系统咋就这么慢呢,而且时

MFC消息映射的原理:笔记

多态的实现机制有两种,一是通过查找绝对位置表,二是查找名称表:两者各有优缺点,那么为什么mfc的消息映射采用了第二种方法,而不是c++使用的第一种呢?因为在mfc的gui类库是一个庞大的继承体系,而里面的每个类有很多成员函数(只说消息反映相关的成员函数啊),而且在派生类中,需要改写的也比较少(我用来做练习的程序就是那么一两个,呵呵).那么用c++的虚函数的实现机制会导致什么问题呢?就是大量虚表的建立使得空间浪费掉很多. 嗯-怎么办呢?于是各大c++名库(比如QT,MFC,VCL-)在消息映射的实

Java的垃圾回收机制笔记

Java的垃圾回收机制笔记 java垃圾回收的意义 确保不再被引用的对象的内存空间被回收. 确保被引用的对象的内存不被错误回收. 再分配内存. java垃圾回收的常用方法 引用计数收集器 堆中的每个对象(不是对象的引用)都有一个引用计数.当一个对象被创建时,给该对象分配一个变量,该变量计数设置设置为1.当任何其他变量被赋值为这个对象的引用,计数加1(a=b,则b引用的对象计数+1),但当一个对象的某个引用超过生命周期或者被设置为一个新值的时候,引用的计数减1(a=c,则a不再指向b指向的对象,而

JVM原理

Java语言写的源程序通过Java编译器,编译成与平台无关的'字节码程序'(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行,而JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器 JAVA和JVM运行的原理 1.Java语言运行的过程 Java语言写的源程序通过Java编译器,编译成与平台无关的'字节码程序'(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行. 也相当与 注:JVM(java虚拟机)包括

JVM并发机制的探讨——内存模型、内存可见性和指令重排序

[转]http://my.oschina.net/chihz/blog/58035 文章写的非常好,为作者点赞. JAVA内存模型 对于我们平时开发的业务应用来说,内存应该是访问速度最快的存储设备,对于频繁访问的数据,我们总是习惯把它们放到内存缓存中,有句话不是说么,缓存就像是清凉油,哪里有问题就抹一抹.但是CPU的运算速度比起内存的访问速度还要快几个量级,为了平衡这个差距,于是就专门为CPU引入了高速缓存,频繁使用的数据放到高速缓存当中,CPU在使用这些数据进行运算的时候就不必再去访问内存.但

JVM类加载机制概述:加载时机与加载过程

摘要: 我们知道,一个.java文件在编译后会形成相应的一个或多个Class文件,这些Class文件中描述了类的各种信息,并且它们最终都需要被加载到虚拟机中才能被运行和使用.事实上,虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的过程就是虚拟机的类加载机制.本文概述了JVM加载类的时机和生命周期,并结合典型案例重点介绍了类的初始化过程,揭开了JVM类加载机制的神秘面纱. 版权声明: 本文原创作者:书呆子Rico 作者

深入JVM虚拟机(二) JVM运行机制

深入JVM虚拟机(二) JVM运行机制 1 JVM运行机制 1.1 JVM启动流程 JVM是Java程序运行的环境,同时是一个操作系统的一个应用程序进程,因此它有自己的生命周期,也有自己的代码和数据空间.JVM工作原理和特点主要是指操作系统装入JVM,是通过jdk中Java.exe来完成通过下面4步来完成JVM环境. 1.创建JVM装载环境和配置. 2.装载JVM.dll. 3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例. 4.调用JNIEnv实例装载并处理class类. J