前言

      本章讨论JVM的概念及其结构的相关知识

方法

1.概念

在说JVM之前,我们不妨聊一下虚拟机的概念。

所谓虚拟机,就是一台虚拟的机器。它是一款软件,用来执行一系列虚拟计算机指令,大体上虚拟机可以分为系统虚拟机和程序虚拟机,我们经常使用的VMware就是系统虚拟机,在其中可以装很多系统,执行不同的指令。而程序虚拟机,首屈一指的便是Java虚拟机,它是为了执行单个计算机程序而设计,具有跨平台的功能。目前最为流行的Java虚拟机为HotSpot虚拟机。

打开我们的CMD窗口,输入java -version,你就会发现这些秘密!

安卓 java虚拟机 安卓虚拟机 jvm_本地方法

2.JVM虚拟机的基本概念

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

3.JVM的结构

JVM的总体机构大体上可以使用下面的图片来表示:

安卓 java虚拟机 安卓虚拟机 jvm_Java_02

1)类加载子系统和方法区:

类加载子系统负责从文件系统或网络中加载class信息,加载的类信息存放于一块称为方法区的内存空间。除了类的信息以外,方法区可能还会存放运行时常量池信息,包括字符串常量以及数字常量等。

2)Java堆

Java堆在虚拟机启动的时候建立,它是Java程序最主要的内存工作区域。几乎所有的Java对象实例都放在Java堆中。堆空间是所有线程共享的,这是一块与Java应用密切相关的内存空间。

3)直接内存

Java的NIO库允许Java程序使用直接内存。直接内存是在Java堆外的、直接向系统申请的内存空间。通常访问直接内存的速度要优于Java堆,因此出于性能的考虑,频繁读写的场可能会考虑使用直接内存。由于直接内存在Java堆外,因此它的大小不会直接受限于Xmx指定的最大堆大小,但是系统内存是有限的,Java堆和直接内存的总和依然受限于操作系统能给出的最大内存。

4)垃圾回收系统

垃圾回收系统是Java虚拟机的重要组成部分,垃圾回收器可以对方法区、Java堆、直接内存进行回收。其中,Java堆是垃圾回收器的工作重点。和C/C++不同,Java中所有对象的空间释放都是隐式的,也就是说,Java中没有方法释放指定的内存区域。对于不在使用的垃圾对象,垃圾回收系统会在后台默默的查找、标记并释放对象,完成对方法区、Java堆、直接内存的全自动管理。

5)Java栈

每个Java虚拟机线程都有一个私有的Java栈,一个线程的Java栈在线程创建的时候被创建,Java栈中保存包含局部变量、方法参数等其他相关信息,同时与方法的调用和返回密切相关。

6)本地方法栈

本地方法栈和Java栈非常类似,最大的不同在于Java栈用于Java程序方法的调用,而本地方法栈则用于本地方法的调用(native标记)。作为Java虚拟机的扩展,Java虚拟机允许Java直接调用本地方法(通常为C语言编写)。

7)PC寄存器

PC寄存器也是每一个线程的私有空间,Java虚拟机会为每一个线程创建PC寄存器。在任意时刻,一个线程总是在执行一个方法,这个被执行的方法称为当前方法。如果当前方法不是本地方法,PC寄存器就会指向当前被执行的指令。如果当前方法是本地方法,那么PC寄存器的值就是undefined。

8)执行引擎

执行引擎是Java虚拟机最核心的组件之一,它负责执行虚拟机的字节码,现代虚拟机为了提高执行效率,会使用即时编译技术将方法编译成机器码之后在执行。

Java HotSpot(TM)  Client VM(-client):为在客户端环境中减少启动时间而优化

Java HotSpot(TM)  Server VM(-server):为在服务器环境中最大化程序执行速度而设计

Java HotSpot Client和Server模式的区别:

当虚拟机运行在-client模式时,使用的是一个代号为c1的轻量级编译器,而-server启动的时候,则采用相对重量级的c2编译器。

c2比c1编译器编译的更加彻底,因此性能更高!

在部分JDK1.6和后序的JDK版本(64位)中,-client参数已经不起作用了,server模式称为唯一!

在JDK安装指定目录下的jvm.cfg文件可以清楚的看出该变化:

我的是64位路径:JAVA_HOME\jre\lib\amd64\jvm.cfg

安卓 java虚拟机 安卓虚拟机 jvm_安卓 java虚拟机_03