《深入Java虚拟机》阅读笔记(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sumsear/article/details/78187485

《深入Java虚拟机》阅读笔记(一)


1. Java虚拟机主要的任务

Java虚拟机主要的任务就是装载class文件并且执行其中的字节码。Java虚拟机中包含一个类装载器(class loader),它可以从程序或API中装载class文件,然后由执行引擎来执行字节码。

2. Java的方法有两种

Java的方法有两种,分别是Java方法和本地方法。其中Java方法由Java语言编写并保存在class文件中,而本地方法一般由c/c++或汇编语言编写,保存在动态链接库中。因为Java语言的特性Java方法的调用是和平台无关的。但是本地方法不同,运行中的Java程序调用本地方法时,虚拟机装载包含这个方法的本地方法动态库,并调用这个方法。通过本地方法,Java程序可以访问底层操作系统的资源。

3. Java class文件在平台无关性和网络移动性方面使Java更适应于网络。
3.1 它在平台无关性方面的主要任务是:

为Java程序提供独立于底层主机平台的二进制形式服务。Java class文件是可以运行在任何支持Java虚拟机的硬件平台和操作系统上的二进制文件,而c/c++编写的程序必须先编译,然后连接成单独的,专门支持特定的硬件平台和操作系统的二进制文件。一般只能在指定的一个平台上执行。

3.2 网络移动性方面主要体现在:

Java class文件的紧凑性的优点。可以让Java文件快速的在网络上传输,大大减少了用户的等待时间。

4. Java虚拟机的生命周期

当一个Java程序启动,那么一个Java虚拟机实例就产生了。当这个程序关闭退出,那么这个Java虚拟机实例也就结束了。在一个计算机上同时启动多个Java程序,那么也会产生同样数量的Java虚拟机实例。每一个Java程序都运行在他自己的虚拟机实例中。

5. Java虚拟机的线程

Java虚拟机的线程分分为两类:守护线程和非守护线程;守护线程通常由虚拟机自己使用,比如执行垃圾收集的任务的线程,但是Java虚拟机也可以把它创建的任何线程标记为守护线程。非守护线程包括常规的用户线程或诸如用于处理GUI事件的事件调度线程,Java的初试线程就是非守护线程。当Java程序中所有非守护线程终止时,Java虚拟机会自动退出,假如安全管理器允许,也可以通过System.exit();方法来退出虚拟机。

6. Java虚拟机的体系结构

每一个Java虚拟机都有一个类加载器子系统,他根据给定的全限定名来装载类型(类和接口)。同样,每一个Java虚拟机都有一个执行引擎,他负责执行那些被装载类的方法中的指令。
当Java虚拟机运行一个Java程序时,它需要内存来存储一些数据,比如:字节码、从已装载的类中解析的其他信息、程序创建的对象、传递给方法的参数、返回值、局部变量以及运算的中间结果。Java虚拟机会将这些信息组织到几个运行时数据区中,以便于管理。

Java虚拟机体系结构图

6.1 方法区:

与堆一样方法区由Java虚拟机的实例中的线程所共享,Java虚拟机装载class文件时,会将从class文件的二进制数据中解析的类型数据存放到方法区中。

6.2 堆:

当Java程序运行时,Java虚拟机会将程序运行过程中创建的对象都存放到Java堆中,与Java方法区一样,Java堆也是由Java虚拟机的实例中的线程共享。

6.3 Java栈:

当一个线程被创建时会获得一个Java栈,用于存储该线程中Java方法调用的状态——包括他的局部变量、方法传递的参数、返回值以及运算的中间结果等等。这个栈不能被别的线程访问。
Java栈是由许许多多的栈帧(stack frame)或者说(frame)组成,每一个栈帧中包含一个Java方法的调用状态,每当线程调用一个Java方法时,虚拟机压入一个新的栈帧到该线程的Java栈中,当方法执行完毕后这个栈帧将被从Java栈中弹出并抛弃。

6.4 PC寄存器:

当一个线程被创建时会获得一个他自己的PC寄存器(程序计数器),这个PC寄存器不能被别的线程访问。如果线程执行的是一个Java方法,那么PC寄存器的值将总是指示下一条将被执行的指令。

6.5 本地方法栈:

本地方法栈主要用来存放本地方法的调用状态。

线程专有的运行时数据区

PS:上图表示的是线程专有的运行时数据区,其中有三个线程在执行,线程3在执行本地方法,上图中的Java栈都是向下生长,图的底部表示Java栈顶。

6.6 Java数据类型

Java虚拟机是通过某些数据类型来执行计算的,而数据类型及其运算都是有Java虚拟机严格规范定义的。在Java中数据类型分为基本类型引用类型
基本数据类型包括:数值类型boolean以及只有Java虚拟机内部使用的returnAddress(用来实现Java中的finally子句),数值类型又分为整数类型(byte,short,int,long,char)和浮点数类型(float,double)。
引用类型包括:类类型、接口类型、数组类型。
这三种引用类型的值都是对动态创建对象的引用。类类型的值是对类的实例的引用,接口类型的值是对实现了该接口的某个类实例的引用,数组类型的值是对数组对象的引用。在Java中null是一种特殊的引用值,它表示该引用变量没有引用任何对象。
Java虚拟机的数据类型

猜你喜欢

转载自blog.csdn.net/sumsear/article/details/78187485