转载请声明:原文转自http://www.cnblogs.com/xiezie/p/5909570.html

1.JVM的生命周期

1.1 JVM的生命周期和程序的生命周期一致

1.2 JVM结束生命周期的情况

1.执行System.exit(int n);//0为正常关闭,!0为异常关闭
2.系统抛出未捕获的异常,或者抛出错误
3.操作系统错误,导致JAVA进程关闭
4.正常执行结束

2. JAVA程序对类的使用方式

1.主动使用:

  • -创建类的实例对象
  • -类被静态调用
    1. -类的静态成员变量被调用或者赋值
    2. -类的静态方法被调用
  • -其子类被主动使用
  • -通过反射调用
  • -Java虚拟机启动时被标明为启动类的类(包含main方法)

2.被动使用:

除了被主动使用之外的方式都属于被动使用(通过classloader.loadclass也算被动使用)

3.类加载器的加载、连接及初始化

3.1 加载:查找并加载类的二进制文件

1.类加载器的共性

  • 除了根加载器,每个类加载器都有一个父类加载器(但是父子间并非一定是继承关系,实现方式是包装、修饰方式)
ClassLoader parent;
protected ClassLoader() {
this(checkCreateClassLoader()//安全监测
, getSystemClassLoader());//默认设置父类加载器是系统加载器
}
protected ClassLoader(ClassLoader parent) {
this(checkCreateClassLoader(), parent);
}
  • 每个加载器都有命名空间(命名空间由该加载器和其父类加载器加载的类构成)
  • 类的加载机制是父亲委托机制(基于安全性的考虑),即加载类的时候先找父类加载器,没有的时候再找子类加载

   实际加载类的类加载器为定义类加载器,其包括其一下的类加载器为初始类加载器

  • .class的获取:
    • 通过直接加载.class文件(如Elipse编译生成的class文件)
    • 从网络获取.class文件————(如URLClassLoader)
    • 从ZIP、jar文件中加载.class文件
    • 动态编译生成
    • 从专用数据库中获取
  • 类加载的时机:
    • JVM规范允许类加载器在预料某个类将要被使用时就预先加载它
    • 类加载器并不需要等到某个类被“首次主动使用”时再加载它
  • 类加载的最终产品是位于堆中的class对象(封装类的方法区内的数据结构)、而且在方法区中放入类的数据结构的接口

2.分类:

  1. 根加载器(Bootstrap):

    • 如果从JAVA代码中获取JAVA核心类库的加载器会返回null——这个加载器无法从java层获取
    • 由JAVA底层的C++实现、执行调用,主要负责加载JVM的核心类库,如执行Java.lang.*包下的一些类
    • 没有父类加载器,也不继承ClassLoader
  2. 扩展加载器(Extension):ExtClassLoader  
    • 主要负责加载java.ext.dirs目录下的类库,或者是JRE目录下的lib\ext目录下的类库,放在这个目录下的jar文件也由扩展加载器自动加载
    • ClassLoader的子类
  3. 系统加载器(System):也称为应用加载器,AppClassLoader
    • 主要负责环境变量中的ClassPath目录下的类加载

3.类加载错误

  • 如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)
  • 如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误

3.2 连接:将加载到内存的二进制数据合并到JAVA运行时环境

1.验证:确保被加载类的正确性

  • -类文件的结构检查
  • -语义检验,是否符合JAVA语言规范
  • -字节码验证
  • -二进制兼容性的验证,如jdk1.5生成的.class文件和jdk1.6生成的.class文件可能存在兼容性问题

2.准备:为类的静态变量分配内存,并初始化其值为默认值。
3.解析:将类中的符号引用转换直接引用

  • 符号引用
  • 直接引用

3.3初始化:为类的静态变量赋予正确的初始值

4.类的卸载

(还在学习中...)

JAVA虚拟机之类加载器的更多相关文章

  1. Hotspot Java虚拟机的类加载器

    从Java虚拟机角度来讲,有两种类加载器.1.启动类加载器.(Bootstrap ClassLoader,C++)2.所有其他类加载器.(Java,java.lang.ClassLoader) 系统提 ...

  2. java虚拟机的类加载器

    一.类的加载可以简单分成两种方式,静态加载和动态加载. 1.静态加载,就是new等方式使用到一个类的实例时,程序在运行到该处时,会把该类的.class文件加载到jvm里. 2.动态加载,通过Class ...

  3. 【深入理解Java虚拟机 】类加载器的命名空间以及类的卸载

    类加载器的命名空间 每个类加载器又有一个命名空间,由其以及其父加载器组成 类加载器的命名空间的作用和影响 每个类加载器又有一个命名空间,由其以及其父加载器组成 在每个类加载器自己的命名空间中不能出现相 ...

  4. 深入理解JVM(③)虚拟机的类加载器(双亲委派模型)

    前言 先解释一下什么是类加载器,通过一个类的全限定名来获取描述该类的二进制字节流,在虚拟机中实现这个动作的代码被称为"类加载器(Class Loader)". 类与类加载器 类加载 ...

  5. 黑马程序员——【Java高新技术】——类加载器

    ---------- android培训.java培训.期待与您交流! ---------- 一.概述 (一)类加载器(class loader) 用来动态加载Java类的工具,它本身也是Java类. ...

  6. 深入理解java虚拟机【类加载机制】

    Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程. 在加载阶段,java虚拟机需要完成以下 ...

  7. Java中的类加载器

    转载:http://blog.csdn.net/zhangjg_blog/article/details/16102131 从java的动态性到类加载机制   我们知道,Java是一种动态语言.那么怎 ...

  8. Java中的类加载器以及Tomcat的类加载机制

    在加载阶段,虚拟机需要完成以下三件事情: 1.通过一个类的全限定名来获取其定义的二进制字节流. 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构. 3.在Java堆中生成一个代表这个类 ...

  9. 黑马程序员:Java基础总结----类加载器

    黑马程序员:Java基础总结 类加载器   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...

随机推荐

  1. Python中的两种结构dict和set

    Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 假设要根据同学的名字查找对应的成绩 如果 ...

  2. 安卓开发44:解决 INSTALL_FAILED_UID_CHANGED 等问题

    apk无法卸载,一般可以下面的方法试一下: 1. 删除/data/app/(filename) 文件夹下的apk包 2. 删除/system/app/(filename) 文件夹下的apk包 3. 将 ...

  3. json格式的字符串转为json对象遇到特殊字符问题解决

    中午做后台发过来的json的时候转为对象,可是有几条数据一直出不来,检查发现json里包含了换行符,造成这种情况的原因可能是编辑部门在编辑的时候打的回车造成的 假设有这样一段json格式的字符串 va ...

  4. Android开发之WebService介绍

    经常有网友问:“在Android平台如何调用WebService”?经过沟通我发现,甚至有些朋友连什么是WebSerivce都不知道就在问怎么使用,更别说和WebService有关的SOAP.WSDL ...

  5. uva 10054 The Necklac(欧拉回路)

    明显的欧拉回路,把颜色作为点,建图后,做一遍欧拉回路.不过我是现学的,打印路径上纠结了一下,发现随着FindEuler()的递归调用的结束,不断把点压入栈中,从后向前打印,遇到"支路&quo ...

  6. 聚焦 SQL 数据库活动异地复制

    Tobias Ternstrom  US-DS-PM 首席部门项目经理 本文作为一系列业务连续性和灾难恢复文章的开篇,概述了业务连续性的各种场景,然后重点介绍 SQL 数据库高级服务级别提供的活动异地 ...

  7. Java泛型的好处

       java 泛型是java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. ...

  8. SharePoint 2010中列表Add和Delete事件解析

    转:http://winsystem.ctocio.com.cn/26/11400026_2.shtml [IT专家网独家撰稿]SharePoint 2010与以前的版本相比,天翻地覆的变化并不为过. ...

  9. alibaba笔试

    1.D  A(7,7)/(A(3,3)A(2,2)) = 420 关联: 字符串的排列和组合:http://blog.csdn.net/hackbuteer1/article/details/7462 ...

  10. 《Python CookBook2》 第四章 Python技巧 - 若列表中某元素存在则返回之 && 在无须共享引用的条件下创建列表的列表

    若列表中某元素存在则返回之 任务: 你有一个列表L,还有一个索引号i,若i是有效索引时,返回L[i],若不是,则返回默认值v 解决方案: 列表支持双向索引,所以i可以为负数 >>> ...