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文件被加载进虚拟机经过了验证等很多的步骤。

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

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

  • 相关阅读:
    /etc/vim/vimrc的一个的配置
    vim上下左右键输出A B
    数据结构-栈的实现之行编译器核心实现
    数据结构-栈的实现之括号匹配检测
    数据结构-栈的实现之数制转换
    数据结构-线性表的链式结构
    数据结构-栈的顺序结构两种方式
    简介
    数据结构-线性表的顺序结构
    NHibernate系列文章十六:使用程序集管理NHibernate项目(附程序下载)
  • 原文地址:https://www.cnblogs.com/linkstar/p/9375106.html
Copyright © 2011-2022 走看看