JVM之类加载过程(一)

1.Java编译

在java开发中,我们写的.java文件经过编译之后得到.class文件,在编译阶段,编译器会对类型、格式检查与编译成字节码文件.

2.类的加载器

我们写的.java文件经过编译之后得到.class文件,然后这个文件通过JVM的虚拟机加载的到内存中,并形成一个class对象,这个称之为类的加载过程,负责将.class字节码文件加载到内存的工具称之为类加载器。

3.Java虚拟机和程序的生命周期

在如下几种情况下面,Java虚拟机将结束生命周期:
1.执行了System.exit()方法。
2.程序正常执行结束
3.程序在执行期间遇到错误或异常导致终止。
4.由操作系统出现错误而导致Java虚拟机进程终止。比如关机等。

4.类的加载过程(重点)

类的加载过程分为如下几个阶段:
加载—-验证—-准备—-解析—–初始化—-使用—–卸载
这里写图片描述
有的情况下把验证、准备、解析统称为连接阶段:
这里写图片描述

5.加载第一个阶段

在上面第一个阶段,加载第一个阶段,由类的加载器进行对.class文件进行加载,类的加载的过程的最终产品是位于堆区的Class对象(class对象封装了类在方法区内的数据结构和,并且向Java程序提供了访问方法区内的数据结构的接口)

Class对象是如何生成的?

Class对象是由虚拟机在类进行初始化的时候,将对象创建到堆区中的。

   /*
     * Constructor. Only the Java Virtual Machine creates Class
     * objects.
     */
    private Class() {}
6.加载器的分类:

总体上分为两种加载器,Java虚拟机自带的加载器、用户自定义的类加载器
- Java虚拟机自带的加载器
根类加载器(Bootstrap)
扩展加载器(Extension)
系统加载器(System)
可以看看下面的程序:

public static void main(String[] args) {
    try {
        Class clazz=Class.forName("java.lang.String");
        System.out.println(clazz.getClassLoader());//为空,则为根类加载器。C++编写
        Class clazz1=Class.forName("com.javacore.basic.practice.Digui");//系统加载器,应用加载器来加载的
        System.out.println(clazz1.getClassLoader());
        //            sun.misc.Launcher$AppClassLoader@18b4aac2
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}
  • 用户自定义的加载器
    java.lang.ClassLoader的子类
    用户定制的类加载器
    其中(java.lang.ClassLoader的子类,必须extends ClassLoader这个类.)

    类加载器并不需要等到某个类被首次主动使用时在加载它,JVM规范规定JVM可以预测加载某一个类,如果这个类出错,但是应用程序没有调用这个类,JVM也不会报错,如果调用这个类的话,JVM才会报错,(LinkAgeError错误)

7.加载Class文件的方式有哪些?

(1)本地直接加载
(2)通过网络下载.class文件(URLClassLoader(URL[] urls))
(3)加载zip,jar文件中的.class文件
这里写图片描述

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区中,然后在堆区创建一个Java.lang.Class对象,用来封装类在方法区的数据结构。我们没有new过Class对象,class.getName()进行这个操作,这个时候虚拟机将Class放入到了方法区,然后创建在堆区创建了一个Class对象。Class封装了所有的类的方法、属性等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值