JVM 1.2 JVM 基本结构

一. 虚拟机基础知识

1.定义 -> 虚拟机:通过软件模拟物理机器执行程序的执行器。

2.虚拟机的分类:

系统虚拟机:系统其他操作系统运行的虚拟机,比如现在使用的Virtual Box,VmWare Station 14等。

程序虚拟机:提供软件运行环境的虚拟机。例如:JVM,FrameWork虚拟机(.net),Android虚拟机(JVM的改进)

基于JVM的开发语言:

Scala、Groovy、JRudy、Jython、Clojure、Clojure、Kotlin、Rhino、Ceylon等

二. JVM虚拟机的基本结构

1. 类加载子系统:

加载编译生成的字节码文件(类信息),加载到方法区。

以java为例,主要的类加载子系统内置三种类加载器(具体加载机制参见 JVM核心技术(二)):

  1. Bootstrap类加载器 – JRE/lib/rt.jar

  2. Extension类加载器 – JRE/lib/ext或者java.ext.dirs指向的目录

  3. Application类加载器 – CLASSPATH环境变量, 由-classpath或-cp选项定义,或者是JAR中的Manifest的classpath属性定义.

2. 方法区:

存放类的信息,类被类加载器加载到方法区后,存放着类的相关信息,静态成员,常量信息,常量池信息(字符串常量池,整数的字节常量池(-128~127之间的整数)等),另外包括由用户加载器加载的引用作为类型信息保存。JDK7中还是把方法区放到了永久代,而JDK8已经把方法区放到了与堆共享内存的元空间(MetaSpace里面了)。可以说,物理上是可以说在堆里面。

3. java 堆(后面着重讲述):

JVM 启动的时候创建Java堆,它是java程序最主要的工作区域,几乎所有的对象实例(部分例外)都放到Java堆中,堆空间是所有线程共享的。

4.直接内存:

Java 的NIO库允许java程序使用直接内存,从而提高性能,通常直接内存速度回优于java堆,读写频繁的场合可能会考虑使用。

5.栈:

每一个JVM线程都有一个私有的栈,故又称JVM是基于栈的虚拟机,每一个线程的java栈会在该线程被创建的时候被创建,它保存着局部变量,方法参数,同时包括java的方法(非本地方法----无native修饰的方法)调用,返回值等。

6.本地方法栈:

与java栈类似,最大的不同主要是,它用于本地方法的调用,一般来说本地方法指的是java调用的外部接口方法,一般来说是C或者C++的方法。实现调用的方式是通过Java提供的JNI方式实现的。例如:Java的判断给定的ile对象是否是目录(isDirectory)方法就是通过调用C++的方法实现的(底层调用的是Windows系统API)。本地方法在Oracle官网提供的JDK没法查看,要看源码的话,可以通过百度或者google 下载 ,这个是提供的免费版本的JDK,虽然维护的频率不是很高,但是还是一直在维护中。

7.垃圾收集系统:

jvm的核心,也是必不可少的,java有一套自己的进行垃圾清理的机制,开发人员无需手动清理。当然这与JVM的默认停顿时间有关。至于JVM是怎样进行垃圾回收的后续将继续详解。

8. PC 寄存器:

是每一个线程私有的内存空间,jvm会为每一个线程创建PC寄存器,在任意时刻,一个java线程总是在执行一个方法,这个方法被称为当前方法。如果当前方法不是本地方法,PC寄存器就会执行当前正在被执行的指令,如果是本地方法,则PC寄存器值为undefined,寄存器存放如当前执行环境指针,程序计数器,操作栈指针,计算的指针等。

9.执行引擎:

它负责执行JVM的字节码,一般来说,用户先进行编译成机器码后执行。

你可能感兴趣的:(JVM基础)