JVM(三)JVM的ClassLoader类加载器
1、类加载的生命周期
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:
(1)加载
(2)验证
(3)准备
(4)解析
(5)初始化
(6)使用
(7)卸载
一共7个阶段。其中验证、准备、解析这3个阶段统称为连接。
这类加载的7个阶段顺序流程:
  
加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的。类的加载过程中必须按照这种顺序按部就班地开始,而解析阶段则是不一定的,它在某些情况下可以在初始化阶段之后再开始,这是为了支持JAVA语言的运行时绑定(也称为动态绑定和晚期绑定)。
初始化的时候执行一些静态代码块,静态变量等。
2、类加载的过程
包括:加载、连接(验证、准备、解析)、初始化。
  
(1)加载:“加载”是“类加载”的过程的一个阶段,在加载阶段虚拟机需要完成3件事:
a、通过一个类的全限定名来获取定义此类的二进制字节流。
b、将这个字节流所代表的静态存储结构转换为方法区的运行时数据结构。
c、在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
(2)验证:验证是连接阶段的第一步,这个阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机的自身安全。
(3)准备:准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。首先,这时候进行内存分配的仅包括类变量(被static修饰的变量)。而不包括实例变量。实例变量将会在对象实例化时随着对象一起分配在java堆中。其次,这里所说的初始值“通常情况”下是数据类型的零值,假设一个类变量的定义为:
public static int value = ;
那变量value值在准备阶段过后的初始值为0而不是112。因为这时候尚未开始执行任何JAVA方法。而把value赋值为112的public static 指令是程序编译后,存放于构造器<cinit>()方法 之中,所以把value赋值为112的动作将在初始化阶段才会执行。
对于那种不是“通常情况”,而是“特殊情况”的变量:
public static int value = ;
编译的时候Javac将会为value生成ConstantValue属性,在准备阶段虚拟机就会根据ConstantValue的设置将value赋值为123,。
(4)解析:解析阶段是将虚拟机常量池内的符号引用替换为直接引用的过程。
(5)初始化:类初始化是类加载过程的最后一步,在这个阶段,前面的类加载过程中,除了在加载阶段用户应用程序可以通过自定义加载器参与之外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的Java程序代码(或者说字节码)。在准备阶段,变量已经赋值过一次系统要求的初始值,而在初始化阶段,则根据程序员通过程序制定的主观计划去初始化变量和其他资源,或者可以从另外一个角度来表达,初始化阶段就是执行类构造器<cinti>()方法的过程。
JVM(三)JVM的ClassLoader类加载器的更多相关文章
- JVM源码分析--ClassLoader类加载器
		
本人原创,转载请注明出处:https://www.cnblogs.com/javallh/p/10224187.html 1.JDK已有类加载器: BootStrap ClassLoader (启动类 ...
 - ClassLoader类加载器
		
总的来说,当动态加载一个资源时,至少有三种类加载器可供选择: 系统类加载器(也被称为应用类加载器)(system classloader) 当前类加载器(current classloader) 当前 ...
 - java ClassLoader类加载器
		
原文 首先来了解一下字节码和class文件的区别: 我们知道,新建一个java对象的时候,JVM要将这个对象对应的字节码加载到内存中,这个字节码的原始信息存放在classpath(就是我们新建Java ...
 - 万万没想到,面试中,连 ClassLoader类加载器 也能问出这么多问题…..
		
1.类加载过程 类加载时机 「加载」 将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在内存上创建一个java.lang.Class对象用来封装类在方法区内的数据 ...
 - Java安全之 ClassLoader类加载器
		
Java安全之 ClassLoader类加载器 0x00 前言 前面这里抛出一个问题,Java到底是什么类型的编程语言?是编译型?还是解释型?在这个问题是其实一直都都有疑惑,如果说是解释型语言的话,那 ...
 - ClassLoader类加载器 & Java类加载机制 & 破坏双亲委托机制
		
ClassLoader类加载器 Java 中的类加载器大致可以分成两类: 一类是系统提供的: 引导类加载器(Bootstrap classloader):它用来加载 Java 的核心库(如rt.jar ...
 - 进阶Java编程(11)ClassLoader类加载器【待完成】
		
1,ClassLoader类加载器简介 在Java里面提供一个系统的环境变量:ClassPath,这个属性的作用主要是在JVM进程启动的时候进行类加载路径的定义,在JVM里面可以根据类加载器而后进行指 ...
 - JVM(三)从JVM源码角度看类加载器层级关系和双亲委派
		
类加载器我们都知道有如下的继承结构,这个关系只是逻辑上的父子关系. 我们一直听说引导类加载器没有实体,为什么没有实体呢? 因为引导类加载器只是一段C++代码并不是什么实体类,所谓的引导类加载器就是那一 ...
 - JVM体系结构之二:类加载器
		
一.概述 定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型.类加载和连接的过程都是在运行期间完成的. 二. 类的加载 ...
 - 【JVM学习笔记】系统类加载器
		
可以通过“java.system.class.loader"属性指定系统类加载器 默认情况下,该属性值为空: public class Test { public static void m ...
 
随机推荐
- Jersey RESTful WebService框架学习(一)
			
介绍:RESTful (Representation State Transfer) 描述了一个架构样式的网络系统,比如 web 应用程序.它首次出现在 2000 年 Roy Fielding 的博士 ...
 - (转)WAMP多站点配置
			
转自:http://wislab.net/archives/43.html Wamp正在被广泛使用,其傻瓜式的安装配置,使得我们可以得心应手地完成以往较为烦琐的服务器环境搭建过程,直接进入到网页程序的 ...
 - LDO-AMS1117
			
AMS1117 1.是AMS艾默森公司简称.与AMS1117对应的IC有LM1117.AMS1117的最大输入电压为15V,而LM1117的极限是20V. 2.其输出电压有固定式(1.5V,1.8V, ...
 - 2.select查询用法
			
1.定义查询接口 UserMapper.java package tk.mybatis.simple.mapper; import tk.mybatis.simple.model.SysRole; i ...
 - 在Delphi中处理word文档与数据库的互联
			
在Delphi中处理word文档与数据库的互联 ---- 目前,Delphi被越来越多的人选中作为MIS系统开发中的前台工具.在以Delphi为前台,一些大型数据库为后台的MIS系统中,图形的处理不可 ...
 - FastReport的使用方法
			
以下是我在网上收集的 这是FastReport的主控件.它包含了调入.保存.预览和打印报表的方法.每个TfrReport控件只能包含一个单独报表. TfrReport属性描 述 DataSet-联接到 ...
 - Android-Java-面向对象与面向过程的简单理解
			
支持面向过程的语言有:C Basic 等语言: 支持面向对象的语言有:C++ Java C# 等语言: 面向过程:操作的是行为/功能: 面向对象:操作的是对象,而对象里面有功能行为,所以可以指定 ...
 - Android-多线程安全问题-synchronized
			
先看一个售票案例Demo,多线程程序对共享数据操作引发的安全问题: package android.java.thread09; /** * 售票线程 */ class Booking impleme ...
 - Linux Buffer/Cache 的区别
			
以前经常使用free -h命令来查看当前操作系统的内存使用情况,同时也注意过返回信息中有一列是buff/cache,来公司之前,面试官还问过我这两个的区别,当时没有回答出来,现在特意回顾记录下: ...
 - [LintCode] Longest Increasing Continuous subsequence
			
http://www.lintcode.com/en/problem/longest-increasing-continuous-subsequence/# Give you an integer a ...