`
klts
  • 浏览: 39442 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论
  • klts: 我一直用的jdk1.6.0_13,感觉还可以
    JDK
  • wuyulunbi: 现在jdk什么版本的稳定
    JDK

类加载

阅读更多

 

类从被加载到虚拟机内存中开始,到卸载出内存为止,整个生命周期:

 




 

一、类加载的时机

 

1. 实例化对象的时候、读取或设置一个类的静态字段的时候、调用一个类的静态方法的时候;

 

2. 使用java.lang.reflect包的方法对类进行反射调用的时候;

 

3. 当初始化一个类,发现其父类还没有进行过初始化,则需要先触发其父类初始化;

 

4. 当虚拟机启动时,用户需要指定一个要执行的主类,虚拟机会先初始化这个主类;

 

5. 当使用jdk1.7的动态语言时,

 

接口的初始化与类的初始化的区别:当一个类在初始化时,其父类必须全部都已经初始化过了,但是接口不一样,它不一定要其父接口全部都完成初始化,只是在真正使用到父接口的时候才让其初始化。

 

二、类加载的过程

 

1.加载:将一个类的二进制字节流代表的静态存储结构转化为方法区的运行时数据结构,相应的在内存中生成class对象,作为方法区这个类的各自数据的访问入口。具体可能的加载文件:(1)从zip中读取,如jar\ear\war(2)从网络中读取,如applet;(3)运行时计算生成,如reflect;(4)从其他文件读取,如jsp

 

2.验证:校验class文件的字节流中包含的信息是否符合当前虚拟机的要求

 

3.准备:主要是为类变量分配内存,并设置其初始值(注意:内存在方法区进行分配,变量的实际值在编译后,才可与变量关联映射上)

 

4.解析:主要是虚拟机将常量池的符号引用替换为直接引用

 

5.初始化:具体真正开始执行类中定义的Java程序代码

 

三、类加载器

 

比较两个类是否“相等”,必须这两个类是由同一个类加载器加载才有意义,否则,即使这两个类来源于同一个Class文件,被同一个虚拟机不同的类加载器加载,这两个类也是不相等的。

 

双亲委派模型:是一个类加载器接收到类加载请求时,首先将请求委托给父类加载器去完成,保证所有的加载请求最终都是由启动类加载器加载。避免了用户自己定义已经加载的对象,通过其它加载器加载,使得java程序会变得一片混乱。

 



 

 

查看java.lang.ClassLoader的loadClass()方法,逻辑:

 

1.   先检查是否已经被加载过

 

2.   如果没有加载则调用父加载器的loadClass方法

 

3.   如果父加载器为空则默认使用启动类加载器加载

 

4.   如果加载失败,抛出ClassNotFoundException异常后,再调用自己的findClass方法进行加载

  protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

 
破坏双亲委派模型

 

第一次:引入双亲委派模型,在jdk1.2时

 

第二次:解决某些基础类要调用回用户的代码,比如JNDI服务

 

第三次:解决追求程序的动态性,比如代码热替换(HotSwap)、模块热部署(Hot Deploymnet),了解osgj的类加载器能掌握类加载的精髓

 

 

  • 大小: 26.1 KB
  • 大小: 54 KB
分享到:
评论

相关推荐

    ClassLoader类加载机制

    类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java ...

    java类加载器实例

    类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java ...

    Java类加载原理解析

    每个java开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载。Java的类加载机制是java技术体系中比较核心的部分,虽然和大部分开发人员直接打交道不多,但是...

    自定义Java类加载器

    看完一个Java加载原理教程后,写了这个自己的类加载器,作个笔记,以便以且使用

    ModRunJava类加载器可以直接从Maven存储库加载并运行类

    Java类加载器可以直接从Maven存储库加载并运行类,能在运行时解决依赖关系

    自定义类加载器实现自定义加载

    自定义类加载器实现自定义加载。自定义类加载器实现自定义加载

    Java虚拟机类加载顺序

    Java虚拟机类加载顺序,Java虚拟机类加载顺序,Java虚拟机类加载顺序

    深入研究Java类加载机制 深入研究Java类加载机制

    深入研究Java类加载机制 深入研究Java类加载机制 深入研究Java类加载机制 深入研究Java类加载机制

    java类加载机制.xmind

    该文件是JVM中关于类加载机制的知识整理的思维导图,包括类加载机制概述、类加载的生命周期、加载时机、加载过程、类加载、类的初始化和实例化等几个大方面进行了讲解,其中类加载中还对JVM三种预定义类加载器进行了...

    java类加载原理分析

    java类加载原理分析,引导类加载器,扩展类加载器,系统类加载器(也叫应用类加载器)

    Java类加载机制与反射-PPT

    Java的类加载机制:加载,连接,初始化。JAVA类加载器: Bootstrap ClassLoader : 根类加载器, Extension ClassLoader: 扩展类加载器, System ClassLoader : 系统类加载器, Java反射

    02 类加载子系统.pptx

    02 类加载子系统 PPT 介绍 JVM 的类加载子系统, 包括类加载阶段和流程、加载器分类和类加载机制等。

    Tomcat7 启动类加载日志

    Tomcat7.0.62 启动类加载日志

    tomcat类加载器

    DevLoader.zip tomcat 类加载器

    java类加载器学习三、类加载器的委托模式

    java类加载器学习三、类加载器的委托模式

    java 类加载器 加密

    java 类加密 使用类加载器解密加载类 反射执行main

    类加载的工具

    类加载分析工具,在应用部署后,可找出是哪个类呗加载了,在那个目录或者jar中,内部资料

    类加载器(java)

    当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初始类加载器层次结构,理解类加载器:J2EE 环境下的 log4j.files

    虚拟机类加载机制

    经典的java虚拟机类加载机制 看完后会有醍醐灌顶的感觉

    自定义类加载器

    简单的自定义类加载器问候世界hello word,基于磁盘的ClassLoader

Global site tag (gtag.js) - Google Analytics