JVM

一、jvm组成

JVM由4大部分组成:ClassLoader,Runtime Data Area,Execution Engine,Native Interface

二、介绍

2.1 Classloader(类加载器)

ClassLoader(类加载器)是负责加载class文件,class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。

Java语言系统自带有三个类加载器:

Bootstrap ClassLoader 最顶层的加载类,主要加载核心类库,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。另外需要注意的是可以通过启动jvm时指定-Xbootclasspath和路径来

改变Bootstrap ClassLoader的加载目录。比如java -Xbootclasspath/a:path被指定的文件追加到默认的bootstrap路径中。我们可以打开我的电脑,在上面的目录下查看,看看这些jar包是不是存在于这个目录。

Extention ClassLoader 扩展的类加载器,加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件。还可以加载-D java.ext.dirs选项指定的目录。

Appclass Loader也称为SystemAppClass 加载当前应用的classpath的所有类。

加载器执行顺序 :1.Bootstrap CLassloder  2.Extention ClassLoader 3.AppClassLoader

双亲委派模型:

类是在运行期间第一次使用时动态加载的,而不是一次性加载。因为如果一次性加载,那么会占用很多的内存。

类的生命周期:

 包括以下 7 个阶段:

加载(Loading)

验证(Verification)

准备(Preparation)

解析(Resolution)

初始化(Initialization)

使用(Using)

卸载(Unloading)

2.2 Native Interface

Native Interface是负责调用本地接口的。他的作用是调用不同语言的接口给JAVA用,他会在Native Method Stack中记录对应的本地方法,然后调用该方法时就通过Execution Engine加载对应的本地lib。原本多于用一些专业领域,如JAVA驱动,地图制作引擎等,现在关于这种本地方法接口的调用已经被类似于Socket通信,WebService等方式取代。

2.3 Execution Engine

 Execution Engine是执行引擎,也叫Interpreter。Class文件被加载后,会把指令和数据信息放入内存中,Execution Engine则负责把这些命令解释给操作系统。

2.4 Runtime Data Area

Runtime Data Area则是存放数据的,分为五部分:Stack,Heap,Method Area,PC Register,Native Method Stack。几乎所有的关于java内存方面的问题,都是集中在这块

java虚拟机栈: 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。通过-Xss来设置其大小

堆: 所有对象都在这里分配内存,是垃圾收集的主要区域("GC 堆")。分为Young Generation和Old Generation(也叫Tenured Generation)两大部分。Young Generation分为Eden和Survivor,Survivor又分为From Space和 ToSpace。通过-Xms和-Xmx来指定最小值和最大值

三、垃圾回收 

 判断一个对象是否可被回收?

 (1)引用计数算法

 (2)可达性算法 :以 GC Roots 为起始点进行搜索,可达的对象都是存活的,不可达的对象可被回收。(java虚拟机使用)

      GC Roots 一般包含以下内容:

虚拟机栈中局部变量表中引用的对象

本地方法栈中 JNI 中引用的对象

方法区中类静态属性引用的对象

方法区中的常量引用的对象

你可能感兴趣的:(JVM)