java class加载机制及对象生成机制
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加载机制及对象生成机制的更多相关文章
- Java提高篇——JVM加载class文件的原理机制
在面试java工程师的时候,这道题经常被问到,故需特别注意. 1.JVM 简介 JVM 是我们Javaer 的最基本功底了,刚开始学Java 的时候,一般都是从“Hello World ”开始的,然后 ...
- Java加载Class文件的原理机制
详见:http://blog.sina.com.cn/s/blog_6cbfd2170100ljmp.html 1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器 ...
- Java ClassLoader加载机制理解
今天看到了一篇介绍Java ClassLoader加载机器的文章, 才发觉一直来自己的肤浅, 好好地给补了一课, 不得不存档! 原文地址: http://www.blogjava.net/lhulcn ...
- Java ClassLoader加载机制理解 实际例子
针对 Java ClassLoader加载机制理解, 做了个如何自定制简单的ClassLoader,并成功加载指定的类. 不废话,直接上代码. package com.chq.study.cl; im ...
- 【设计模式】C++单例模式的几种写法——Java自动加载内部类对象,C++怎么破?
单例模式是最简单的设计模式,就让我像玩简单的游戏一样写下去吧. v1: 简单模式 和这个版本有过一面之缘,但不敢苟同. class Singleton { private: Singleton() { ...
- JVM加载class文件的原理机制(转)
JVM加载class文件的原理机制 1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中 2.java中的 ...
- Mybatis源码解读-SpringBoot中配置加载和Mapper的生成
本文mybatis-spring-boot探讨在springboot工程中mybatis相关对象的注册与加载. 建议先了解mybatis在spring中的使用和springboot自动装载机制,再看此 ...
- Java虚拟机加载类
Java虚拟机是如何加载Java类的 Java虚拟机加载Java类总共需要经过3步:加载-----链接-----初始化.Java语言的类型可以分为两大类:基本类型和引用类型.基本类型是有Java虚拟机 ...
- JVM加载class文件的原理机制
Java中的所有类,都需要由类加载器装载到JVM中才能运行.类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中.在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的 ...
随机推荐
- 转:Java eclipse下 Ant build.xml实例详解
在有eclipse集成环境下ant其实不是很重要,但有些项目需要用到,另外通过eclipse来学习和理解ant是个很好的途径,所以写他demo总结下要点,希望能够帮到大家. 一.本人测试环境eclip ...
- MFC设置窗体大小SetWindowPos
SetWindowPos(NULL,0,0,200,300,SWP_NOMOVE); 表示不考虑(0,0),仅仅将大小改为200x300,位置不变 SetWindowPos(NULL,0,0,2 ...
- 判断iPhone/android手机
JS判断请求来自Android手机还是iPhone手机,根据不同的手机跳转到不同的链接. var browser = {versions: function () {var u = navigator ...
- Java 错误:找不到或无法加载主类
环境变量的配置有问题,你改改吧:HOME是 D:\Java\jdk1.8.0_11 Path是 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin CLASSPATH是 .;%JA ...
- CGI接口原理及实现(转载)
原文:http://blog.csdn.net/duola_rain/article/details/15812585 CGI接口原理及实现(2012-12-7 Over) 1.CGI定义: CGI( ...
- c# toolstrip控件怎么把左边的几个小点去掉??
选中你的toolstrip 然后属性属性中有个 GripStyle 设置Hidden
- DRAM Memory Rank知识
DRAM的一些知识点,先记录下来再进行整理 1.何为Memory rank? A memory rank is a set of DRAM chips connected to the same ch ...
- XHTML与HTML的差别
HTML与XHTML之间的差别,粗略可以分为两大类比较:一个是功能上的差别,另外是书写习惯的差别.关于功能上的差别,主要是XHTML可兼容各大浏览器.手机以及PDA,并且浏览器也能快速正确地编译网页. ...
- HTTPS连接前的几毫秒发生了什么?
原文:http://blog.jobbole.com/48369/ 提示:英文原文写于2009年,当时的Firefox和最新版的Firefox,界面也有很大改动.以下是正文. 花了数小时阅读了如潮的好 ...
- PAT 天梯赛 L1-009 N个数求和
模拟题 题目链接 题解 每次将两个分数进行相加,到最后再将结果化成带分数.主要考察的最大公约数与最小公倍数. 代码如下: #include<cstdio> #include<cstd ...