JVM 调优篇1 类的加载器与加载过程

一  基本知识

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包,也可以是网络上

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值