zoukankan      html  css  js  c++  java
  • 大战Java虚拟机【3】—— 类加载机制

    前言

    当你的代码编译成class文件之后,那么虚拟机如何加载这些文件呢?我们需要知道虚拟机到底做了什么样的事情。

    类的生命周期

    加载--链接---初始化----使用---卸载

    类加载过程

    1、加载

    读取二进制字节流,将静态存储结构转化为方法区运行时的数据结构,在内存中生词一个代表这个类的对象。

    2、验证

    验证格式,元数据,字节码,符合引用,总之就是避免一些恶意代码。

    3、准备

    为类分配内存并设置变量初始值static的,注意这里只是初始值,而不是赋值,赋值是在初始化做的

    4、解析

    将常量池中的符合替换成直接引用。

    5、初始化

    在5个情况下会进行初始化,牢记!

    new

    反射调用

    子类初始化需要先初始化父类

    main主类

    jdk1.7动态语言支持

    类与类加载器

    1、类与类加载器确定了一个类在虚拟机中的唯一性。

    类加载器不同,那么两个对象一定不同。

    2、有两种类加载器

    一种是启动类加载器,使用c++实现,是虚拟机一部分。

    还有一种就是继承自ClassLoader的类加载器

    3、双亲委派模型

    除了顶层启动类加载器之外,其余的加载器都应该有自己的父类加载器,一般使用组合实现而不是继承。

    一个类加载器收到类加载的请求首先会委派给父类去完成,只有当父类无法完成加载时才会自己去加载。

    好处:所有类都继承自Object,Object都是由启动类来加载的,就是一个Object了,不然自己加载自己的就乱套了。

    总结

    类从Class文件被加载进虚拟机经过了验证等很多的步骤。

    其中我们需要重点了解的是类是什么时候被加载的,什么时候被初始化的,初始化的顺序,因为这对于我们写程序来说是有直接关系的。

    还需要知道类加载器并只是单纯的像名字所说的一样,加载一个类就完事了,它有自己重要的作用。

  • 相关阅读:
    SSL 1579——泽泽在巴西
    SSL 1644——取数字问题
    SSL 1589——火车票
    SSL 1506——打鼹鼠
    SSL 1212——大厅安排
    洛谷 1064——金明的预算方案(动态规划的背包问题)
    SSL 1463——公共子串
    SSL 1461——最大连续数列的和
    SSL 1643——最小乘车费用
    SSL 1460——最小代价问题
  • 原文地址:https://www.cnblogs.com/linkstar/p/9375106.html
Copyright © 2011-2022 走看看