首先是JDK
javadevelopmentkit ( JDK )是Java语言的软件开发工具包( SDK )。 JDK的安装目录下有一个jre目录,其中有两个文件夹bin和lib。 这里bin中的是jvm,lib中的是jvm工作所需的类库,我们认为jvm和lib合称为jre。
然后再看看JRE
javaruntimeenvironment,Java运行时环境,包括JVM标准实现和Java核心类库。 JRE是Java运行时环境,不是开发环境,因此不包含编译器和调试器等开发工具
最后,JVM也一目了然
JVM是Javavirtualmachine(Java虚拟机)的缩写,JVM是计算设备的规范,是通过在实际计算机上模拟各种计算机功能实现的虚构计算机
从上图中一目了然:
JDK是整个Java的核心,包括Java运行时环境JRE、Java工具和Java基类库。 JRE是运行JAVA程序所需的环境集合,包含JVM标准实现和JAVA核心类库。 JVM是实现整个java跨平台的最核心部分,可以运行用java语言编写的程序。
JVM体系结构和操作原理:
用Java语言写的源程序通过Java编译器被编译成不依赖于平台的“字节码程序”(.class文件,即0、1二进制程序) ),安装在OS上的Java
整个JVM类加载过程的步骤:
1 .加载
加载过程找到二进制字节码并将其加载到JVM中。 JVM使用ClassLoader来加载类名、类所在的包名和类。 同样,要标识加载的类,请使用类名包名ClassLoader实例ID的三个元素。
2 .链接
链接过程负责验证二进制代码的格式、初始化负载类中的静态变量、解析类中调用的接口和类。
验证完成后,JVM将初始化类中的静态变量,并将该值指定为默认值。
最后,通过验证类中的所有属性、方法,验证是否存在需要调用的属性、方法,以及是否具有适当的权限( public、private域权限等),可以验证NoSuchMethodError、NoSuchMethodError
3 .初始化
初始化过程是对运行类中的静态初始化代码、构造函数代码和静态属性的初始化,在以下四种情况下启动:
调用了new;
反射调用了类中的方法;
子类调用了初始化;
在JVM启动期间指定的初始化类。
ClassLoader抽象类的几种重要方法:
(1)加载类
此方法加载具有给定名称的类。 ClassLoader的实现方法是从已经加载的类开始查找,否则继续从parent ClassLoader开始查找。 如果仍然找不到,请从System ClassLoader中查找,最后调用findClass方法进行查找。 如果要更改类的加载顺序,可以将其复盖
)2) findLoadedClass
此方法搜索从当前ClassLoader实例对象的缓存中加载的类,然后调用native方法。
)3)查找类
由于此方法直接抛出ClassNotFoundException,因此必须通过loadClass或复盖此方法来定制和加载相应的类。
(4) findSystemClass
此方法从System ClassLoader中搜索类,如果找不到,则继续从Bootstrap ClassLoader中搜索,如果找到,则返回null。
)5)定义类
此方法将二进制字节码转换为Class对象
(6)解析类
此方法负责完成到Class对象的链接,如果链接了,则直接返回。
JVM运行时数据区:
第一区块: PC寄存器
PC寄存器用于存储每个线程下一个要执行的JVM指令,如果方法为native,则PC寄存器不会存储任何信息。
第二个块: JVM堆栈
JVM栈是线程的专用栈,它为每个线程创建一个JVM栈。 JVM堆栈包含当前线程的本地基本类型的变量( java中定义的8个基本类型:布尔、字符、字节、短整型、int、long、浮点和双精度)以及部分返回结果
第三张:堆( Heap ) )。
这是JVM用于存储对象实例和数组值的区域,Java在new中创建的所有对象的内存都将分配给此处,而Heap对象的内存必须等待GC回收。
第四方框:方法区域) )。
(1)在Sun JDK中,该区域对应PermanetGeneration,也称为永久世代。
)方法区域容纳了加载的类的信息(名称、修饰符等)、类内的静态变量、类内定义为final型的常数、类内的Field信息、类内的方法信息,开发者在程序内可以看到Class 从isInterface等方法检索信息时,即使在源于方法区域的某些条件下,所有这些数据也会被GC,如果方法区域需要使用的内存超过允许的大小,则会抛出OutOfMemory错误消息。
第五方框:运行时常量池( Runtime Constant Pool ) ) )。
类内的固定参数信息、方法、对领域的参照信息等被存储,其空间是从方法领域分配的。
第六块:局部方法堆栈)。
JVM使用本地方法堆栈支持执行存储每个native方法调用的状态的native方法。