一 . JVM/JDK/JRE 的区别
JDK
Java Development ToolKit(Java开发工具包),JDK是整个JAVA的核心;
包括了Java运行 环境(Java Runtime Envirnment),一堆Java工具(javac/java/jdb等) 和Java基础的类 库(即Java API 包括rt.jar)。
三个版本:
·SE(J2SE)标准版,是我们通常用的一个版本
·EE(J2EE)企业版,使用这种JDK开发J2EE应用程序
·ME(J2ME)主要用于移动设备、嵌入式设备上的java应用程序
JRE
Java Runtime Enviromental(java运行时环境)。
也就是我们说的JAVA平台,所有的Java程序都要在JRE下才能运行。包括JVM和JAVA核心类库和支持文件。
与JDK相比,它不包含开发工具——编译器、调试器和其它工具。
JVM
Java Virtual Mechinal(JAVA虚拟机)。JVM是JRE的一部分
java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行
关系图
二. 【摘抄】 类加载过程
流程图:
1. 编译
javac编译器将java的源文件,编译为class的文件(字节码文件)只有这种字节码文件才能够在java虚拟机中运行;
2.加载
类加载:ClassLoader类加载器加载类并把类的信息加载到jvm的方法区中,然后在堆区中实例化一个java.lang.Class对象,作为方法区中这个类的信息的入口
类加载常用的方式:
·一种是根据类的全路径名找到相应的class文件,然后从class文件中读取文件内容
·另一种是从jar文件中读取
3. 连接
主要任务就是做一些加载后的验证工作以及一些初始化前的准备工作,可以细分为三个步骤:验证、准备和解析。
验证:当一个类被加载之后,必须要验证一下这个类是否合法,保证加载的类是能够被 jvm所运行
准备:为类的静态变量分配内存并设为jvm默认的初值,对于非静态的变量,则不会 为它们分配内存
注意: 静态变量的初值为jvm默认的初值,而不是我们在程序中设定的初值
如果是常量,则是设定的值
解析:把常量池中的符号引用转换为直接引用,即jvm会将所有的类或接口名、字段名、方法名转换为具体的内存地址。
4.初始化
初始化顺序:
·在类的初始化阶段,只会初始化与类相关的静态赋值语句和静态语句,非静态在实例化对象的时候才会运行。
·按照顺序自上而下运行类中的变量赋值语句和静态语句,如果有父类,则首先按照顺序运行父类中的变量赋值语句和静态语句
1.大方向上面:先执行类的初始化构造<clinit>,在执行对象实例化构造方法
2.然后根据子类的初始化<clinit>之前先要保证父类初始化<clinit>被先调用
3.实例化子类对象的时候,先要调用父类构造(构造方法)
5.使用
6.卸载
对象没有被任何地方引用,jvm就会在内存垃圾回收的时候对类进行卸载,就是垃圾回收,java类的整个生命周期就结束了。