首先是JDK
JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib合起来就称为jre。
然后我们来看JRE
JRE(Java Runtime Environment,Java运行环境),包含JVM标准实现及Java核心类库。JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器)
最后JVM也一目了然了
JVM是Java Virtual Machine(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、NoSuchFieldError等错误信息。
3. 初始化
初始化过程即为执行类中的静态初始化代码、构造器代码以及静态属性的初始化,在四种情况下初始化过程会被触发执行:
调用了new;
反射调用了类中的方法;
子类调用了初始化;
JVM启动过程中指定的初始化类。
ClassLoader抽象类的几个关键方法:
(1) loadClass
此方法负责加载指定名字的类,ClassLoader的实现方法为先从已经加载的类中寻找,如没有则继续从parent ClassLoader中寻找,如仍然没找到,则从System ClassLoader中寻找,最后再调用findClass方法来寻找,如要改变类的加载顺序,则可覆盖此方法
(2) findLoadedClass
此方法负责从当前ClassLoader实例对象的缓存中寻找已加载的类,调用的为native的方法。
(3) findClass
此方法直接抛出ClassNotFoundException,因此需要通过覆盖loadClass或此方法来以自定义的方式加载相应的类。
(4) findSystemClass
此方法负责从System ClassLoader中寻找类,如未找到,则继续从Bootstrap ClassLoader中寻找,如仍然为找到,则返回null。
(5) defineClass
此方法负责将二进制的字节码转换为Class对象
(6) resolveClass
此方法负责完成Class对象的链接,如已链接过,则会直接返回。
JVM运行时数据区:
第一块:PC寄存器
PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息。
第二块:JVM栈
JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址
第三块:堆(Heap)
它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。
第四块:方法区域(Method Area)
(1)在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代。
(2)方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。
第五块:运行时常量池(Runtime Constant Pool)
存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。
第六块:本地方法堆栈(Native Method Stacks)
JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。
JVM、JRE、JDK有什么联系和区别
JDK是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。JRE是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。JVM是整个java实现跨平台的最核心的部分,能够运行以Java语言写的程序。JVM体系结构与运行原理:Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程...
面试题支招-JDK,JVM 和 JRE三者的联系和区别
1. JDK用于开发Java程序,包含了JRE和开发工具。JRE则是运行Java程序所需的环境,包含了JVM和核心类库。JVM是Java程序执行的关键组件,负责解释执行Java字节码。2. JDK和JRE中都包含了JVM,它们是紧密关联的组成部分。3. JVM是Java语言实现跨平台执行的核心,它确保了Java程序能够在不同的操作系统上运行...
问JAVA中 JDK JVM JRE三者的关系区别
1.定义JDK:Java Develpment Kit java 开发工具JRE:Java Runtime Environment java运行时环境JVM:java Virtual Machine java 虚拟机2. 使用人群jdk 是给开发人员使用的, jre和jvm是给普通用户使用3. 详细介绍JDK:是java开发工具包,是Sun公司针对java开发人员的产品,jdk中包含jre,在jdk的安装目录下...
什么是jvm,jre,jdk及它们之间的关系
JDK是JAVA程序开发时用的开发工具包,其内部也有Java运行环境JRE。JRE是Java程序运行时需要的运行环境,就是说如果你光是运行Java程序而不是去搞开发的话,只安装JRE就能运行已经存在的Java程序了。JDk、JRE内部都包含JAVA虚拟机JVM,JAVA虚拟机内部包含许多应用程序的类的解释器和类加载器等等。
java中的jdk,jre和jvm有什么区别和联系?
JRE,即Java运行时环境,包含了JVM的标准实现和Java基本类库。与JVM相比,JRE增加了部分Java类库,为Java程序的运行提供支持。JDK,即Java开发工具包,集成了JRE和各种开发工具,如javac.exe、java.exe和jar.exe等,是Java开发的必备工具。当我们安装JDK时,会发现有两个版本的JRE。实际上,这两个JRE是...
jdk jre jvm 的区别和联系
JDK,JRE,JVM的区别与联系 JDK(Java Development ToolKit) java 开发工具 JDK是Java语言的软件开发工具包SDK。针对java开发者使用,整个Java的核心,包括Java运行环境JRE,Java工具(编译器,打包压缩工具,调试工具,反编译工具),和Java基础类库等。JRE(Java Runtime Environment) Java运行环境 Java运行环境...
JDK、JRE、JVM,是什么关系?
在 Java 技术栈中,JDK、JRE、JVM 三者的关系如同金字塔一般,层层相扣,构成了 Java 应用程序运行的基础。JDK(Java Development Kit)是 Java 开发工具包,包含了 JRE 以及各种开发工具,如编译器、调试器等,用于构建和运行 Java 应用程序。JRE(Java Runtime Environment)是 Java 运行环境,它包括...
什么是JDK?什么是JRE?什么是JVM?它们有啥联系+区别?
JDK、JRE和JVM是Java平台的核心组成部分,它们之间的关系错综复杂但又密切相关。JDK是Java开发的核心工具包,它包含JRE,而JVM则是运行Java程序的虚拟执行环境。Oracle官网的定义清晰地解释了它们的联系与区别:JDK(Java Development Kit)是开发者的工具箱,它不仅包含JRE的所有内容,还包括编译器、调试器...
JDK,JRE,JVM区别与联系
JRE里面有一个 JVM , JRE 与具体的 CPU 结构和操作系统有关,我们从 Sun 下载 JRE 的时候就看到了不同的各种版本,,同 JVM 一起组成 JRE 的还有 一些 API (如 awt , swing 等), JRE 是 运行 Java 程序必不可少的.JDK -- java development kit JDK是java开发工具包,基本上每个学...
JDK、JRE和JVM是什么?他们的区别又是什么?天津java培训
JRE:普通用户用来安装运行java,而程序员则要用JDK来编译、调试程序。JVM:这是负责在运行程序时将字节转换成特定的机器代码,并且还有内存管理和垃圾回收的机制。区别:1、JDK用于开发,JRE用于运行java程序 ;2、JDK和JRE中都包含JVM ;3、JVM是java编程语言的核心并且具有平台的独立性。