一 基本知识
1.1 JIT&AOT
JIT: Just Time compilation 即时编译器
在程序运行时将字节码或中间表示转换为机器代码。
AOT: Ahead of Tmie Compilation : 预编译
在程序运行之前将高级语言代码完全编译成机器代码。
1.2 字面量和符号引用*
字面量:在java中,字面量是指在代码中直接出现具体的值,如 String str=“123”;
符号引用:是对某个方法、字段或类的引用,这个引用指向元数据的引用。
public class Jia
{
int field;
void method(){
}
public static void main(String[] args) {
Jia j = new Jia();
j.field = 33;//字段引用
j.method();//方法引用
}
}
field是对类的字段的符号引用,method()是对类的方法的符号引用。这些引用指向的是元数据,而不是具体的值。
二 类的加载
2.1 jvm的类加载器*
ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的java.lang.Class对象实例。然后交给Java虚拟机进行链接、初始化等操作。
类加载器分类:

1)启动类加载器(引导类加载器,Bootstrap ClassLoader)
这个类加载使用C/C++语言实现的,嵌套在JVM内部。它用来加载Java的核心库(JAVA_HOME/jre/lib/rt.jar或sun.boot.class.path路径下的内容)。用于提供JVM自身需要的类。
并不继承自java.lang.ClassLoader,没有父加载器。
出于安全考虑,Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类。加载扩展类和应用程序类加载器,并指定为它们的父类加载器。

2)扩展类加载器(Extension ClassLoader)
Java语言编写,由sun.misc.Launcher$ExtClassLoader实现。
继承于ClassLoader类;父类加载器为启动类加载器
从java.ext.dirs系统属性所指定的目录中加载类库,或从JDK的安装目录的jre/lib/ext子目录下加载类库。如果用户创建的JAR放在此目录下,也会自动由扩展类加载器加载。

3)应用程序类加载器(系统类加载器,AppClassLoader)
java语言编写,由sun.misc.Launcher$AppClassLoader实现
继承于ClassLoader类;父类加载器为扩展类加载器
它负责加载环境变量classpath或系统属性java.class.path 指定路径下的类库
应用程序中的类加载器默认是系统类加载器。它是用户自定义类加载器的默认父加载器
通过ClassLoader的getSystemClassLoader()方法可以获取到该类加载器
4)用户自定义类加载器
自定义类加载器体现Java语言强大生命力和巨大魅力的关键因素之一便是:Java开发者可以自定义类加载器来实现类库的动态加载,加载源可以是本地的JAR包,也可以是网络上

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



