java class加载机制及对象生成机制

当使用到某个类,但该类还未初始化,未加载到内存中时会经历类加载链接初始化三个步骤完成类的初始化。需要注意的是类的初始化和链接的顺序有可能是互换的。

ClassLoader加载机制

ClassLoader用于动态加载class文件到内存中。

Java 提供了三个ClassLoader:

  • 启动类加载器(BootStrap ClassLoader):java类加载器中最顶层的类加载器,负责加载jdk中核心的类库,如:rt.jar、resources.jar、charsets.jar等。

    可通过System.out.println(System.getProperty("sun.boot.class.path")); 查看。
  • 扩展类加载器(Extension ClassLoader):负责加载java的扩展类库,默认加载:JAVA_HOME/jre/lib/ext目录下的jar。
  • 系统类加载器(App ClassLoader):负责加载应用程序classpath下的所有jar和class文件。
  • 自定义类加载器(CustomClassLoader):自定义类加载器必须继承自java.lang.ClassLoader

ClassLoader加载类的原理

  • 首先由最顶层的类加载器Bootstrap ClassLoader试图加载
  • 如果没加载到,则把任务转交给Extension ClassLoader试图加载
  • 如果也没加载到,则转交给App ClassLoader 进行加载

JVM类加载机制

  • 全盘负责:当一个类加载某个class时,该class依赖的和引用的其它class都有该加载器负责加载,除非显式使用另外一个类加载器来载入。
  • 父类委托:先让父类试图加载该类,只有在父类无法加载该类时才从自己的类路径中进行加载。
  • 缓存机制:所有加载过的类都会缓存在内存中,如果程序中尝试使用某个class时,先从缓存中查找这个类;如果不存在,则读取该类对应的二进制文件并将其转换为class对象并存入缓存区。这就是为什么类修改后需要重启的原因。

双亲委派模型的工作过程

  • 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的加载器都是如此,因此所有的类加载请求都会传给顶层的启动类加载器。
  • 只有当父加载器反馈自己无法完成该加载请求(该加载器的搜索范围中没有找到对应的类)时,子加载器才会尝试自己去加载。

使用双亲委派模型的优点:

  • 保证了类加载的唯一性
  • 避免应用程序出现混乱

类的链接

当类加载完成后,系统会给为之生成一个对象;随后进入链接阶段,链接阶段负责把类的二进制数据添加到JRE中。

三个阶段:

  • 验证:检验被加载的类是否有正确的内部结构,并和其他类协调一致
  • 准备:负责为类的类变量分配内存。并设置默认初始值
  • 解析:将类的二进制数据中的符号引用替换成直接引用

类的初始化

JVM负责对类进行初始化,主要对类变量进行初始化

在Java中对类变量进行初始值设定有两种方式:

* 声明类变量是指定初始值
* 使用静态代码块为类变量指定初始值

JVM初始化步骤

  • 假如这个类还没有被加载和连接,则程序先加载并连接该类
  • 假如该类的直接父类还没有被初始化,则先初始化其直接父类
  • 假如类中有初始化语句,则系统依次执行这些初始化语句

参考文档:

java class加载机制及对象生成机制的更多相关文章

  1. Java提高篇——JVM加载class文件的原理机制

    在面试java工程师的时候,这道题经常被问到,故需特别注意. 1.JVM 简介 JVM 是我们Javaer 的最基本功底了,刚开始学Java 的时候,一般都是从“Hello World ”开始的,然后 ...

  2. Java加载Class文件的原理机制

    详见:http://blog.sina.com.cn/s/blog_6cbfd2170100ljmp.html 1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器 ...

  3. Java ClassLoader加载机制理解

    今天看到了一篇介绍Java ClassLoader加载机器的文章, 才发觉一直来自己的肤浅, 好好地给补了一课, 不得不存档! 原文地址: http://www.blogjava.net/lhulcn ...

  4. Java ClassLoader加载机制理解 实际例子

    针对 Java ClassLoader加载机制理解, 做了个如何自定制简单的ClassLoader,并成功加载指定的类. 不废话,直接上代码. package com.chq.study.cl; im ...

  5. 【设计模式】C++单例模式的几种写法——Java自动加载内部类对象,C++怎么破?

    单例模式是最简单的设计模式,就让我像玩简单的游戏一样写下去吧. v1: 简单模式 和这个版本有过一面之缘,但不敢苟同. class Singleton { private: Singleton() { ...

  6. JVM加载class文件的原理机制(转)

    JVM加载class文件的原理机制 1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中 2.java中的 ...

  7. Mybatis源码解读-SpringBoot中配置加载和Mapper的生成

    本文mybatis-spring-boot探讨在springboot工程中mybatis相关对象的注册与加载. 建议先了解mybatis在spring中的使用和springboot自动装载机制,再看此 ...

  8. Java虚拟机加载类

    Java虚拟机是如何加载Java类的 Java虚拟机加载Java类总共需要经过3步:加载-----链接-----初始化.Java语言的类型可以分为两大类:基本类型和引用类型.基本类型是有Java虚拟机 ...

  9. JVM加载class文件的原理机制

    Java中的所有类,都需要由类加载器装载到JVM中才能运行.类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中.在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的 ...

随机推荐

  1. cordova 启动界面config.xml配置

    <preference name="SplashScreen" value="screen"/> <preference name=" ...

  2. Css span div

    SPAN元素和DIV元素有什么区别 解决思路: 最明显的区别是:DIV是块元素,SPAN是内嵌元素.块元素相当于内嵌元素在前后各加一个<br>换行.其实,块元素和行内元素也不是一成不变的, ...

  3. 一种快速查询多点DS18B20温度的方法(转)

    源:http://hi.baidu.com/james_xiao/item/79b961c90623093e45941623 一种快速查询多点DS18B20温度的方法 引言      为了满足实时性要 ...

  4. C#入门经典第四章-流程控制-1

    布尔类型:

  5. poj 1837 Balance 动态规划 (经典好题,很锻炼思维)

    题目大意:给你一个天平,并给出m个刻度,n个砝码,刻度的绝对值代表距离平衡点的位置,并给出每个砝码的重量.达到平衡状态的方法有几种. 题目思路:首先我们先要明确dp数组的作用,dp[i][j]中,i为 ...

  6. Warning: The Copy Bundle Resources build phase contains this target's Info.plist file 'yintingting_baisi/Info.plist'.

    处理方法: The INFOPLIST_FILE build setting specifies the name of the Info.plist associated with your tar ...

  7. ZOJ3944People Counting<暴力/枚举>

    题意:输入一张照片,给出人物的特征,判断有多少个人. .O. /|\ (.) 思路:按照3*3的图统计,只要有一个点符合就加1 #include<cstdio> #include<i ...

  8. drawRect & 内存 -> 深究

    转载自:http://bihongbo.com/2016/01/03/memoryGhostdrawRect/ 在平日的开发中,随意覆盖drawRect方法,稍有不慎就会让你的程序内存暴增.下面我们来 ...

  9. Codeforces Round #368 (Div. 2)D. Persistent Bookcase DFS

    题目链接:http://codeforces.com/contest/707/my 看了这位大神的详细分析,一下子明白了.链接:http://blog.csdn.net/queuelovestack/ ...

  10. javactript关闭窗体,刷新父窗体

    //关闭,父窗口弹出对话框,子窗口直接关闭this.Response.Write("<script language=javascript>window.close();< ...