JVM类载入过程及主动引用与被动引用
了解类载入全过程,有助于了解JVM执行过程,以及更深入了解java动态性(解热部署,动态载入),提高程序灵活性。
类载入全过程:
JVM将class文件字节码文件载入到内存中。并对数据进行校验解析和初始化,终于形成能够直接使用的java类型的过程。
载入
将class文件字节码内容载入到内存中,并将这些静态数据转换成方法区中的执行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的訪问入口。
链接
将Java类的二进制代码合并到JVM的执行状态之中的过程。
验证
确保载入的类信息符合JVM规范,没有安全方面的问题。
准备
正式为类变量(static变量)分配内存。并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。
解析
虚拟机常量池内的符号引用替换为直接引用的过程。
初始化
初始化阶段是执行类构造器<clinit>()方法的过程。
类构造器<clinit>()方法是由编译器自己主动收集类中的全部类变量的赋值动作和静态语句块(static块)中的语句合并产生的。
当初始化一个类的时候,假设发现其父类还没有进行过初始化、则须要先触发其父类的初始化。
虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确加锁和同步。
当訪问一个java类的静态域时。仅仅有真正声明这个域的类才会被初始化。
使用
卸载
类载入Demo:
package JVMProcess;
public class Demo {
public static void main(String[] args) {
A a = new A();
System.out.println(A.width);
}
}
class A{
public static int width = 100;
static{
System.out.println("静态初始化类A");
width = 30;
}
public A(){
System.out.println("创建A类的对象");
}
}
执行结果:
静态初始化类A
创建A类的对象
30
初始化过程Demo
package JVMProcess;
public class DemoInit {
static
{
System.out.println("静态初始化DemoInit");
}
public static void main(String[] args) {
System.out.println("DemoInit的main方法");
AInit a = new AInit();
System.out.println(AInit.width);
AInit a2 = new AInit(); //类仅仅会载入和初始化一次,对象能够new多个。
}
}
class AInit extends AInit_Father
{
public static int width = 100;//静态变量,静态域 field
static
{
System.out.println("静态初始化类AInit");
width = 30;
}
public AInit()
{
System.out.println("创建AInit类的对象");
}
}
class AInit_Father{
static{
System.out.println("静态初始化AInit_Father");
}
}
被动引用和主动引用
类的主动引用(一定会发生类的初始化)
new一个类的对象。
调用类的静态成员(除了final常最)和静态方法。
使用java.lang.reflect包的方法对类进行反射调用。
当虚拟机启动,java Hello则一定会初始化Hello类。
说白了就是先启动main方法所在的类。
当初始化一个类,假设其父类没有被初始化,则先会初始化他的父类。
类的被动引用(不会发生类的初始化)
当訪问一个静态域时。仅仅有真正声明这个域的类才会被初始化。
通过子类引用父类的静态变量,不会导致子类初始化。
通过数组定义类引用,用不会触发此类的初始化。
引用常量不会触发此类的初始化(常量在编译阶段就存入调用类的常量池中了)
被动引用和主动引用Demo
package JVMProcess;
public class MPRefDemo {
public static void main(String[] args) throws ClassNotFoundException {
//主动引用
//new AInitRef();
//System.out.println(AInitRef.width);会初始化AInitRef
//反射调用也会初始化
//Class.forName("JVMProcess.AInitRef");
//被动引用
//常量
//System.out.println(AInitRef.MAX);//不会初始化AInitRef
//数组定义类引用
//AInitRef[] as = new AInitRef[10];
//System.out.println(B.width);//B不会初始化,AInitRef会初始化
System.out.println(B.MAX);//B和AInitRef都不会初始化
}
}
class B extends AInitRef
{
static
{
System.out.println("静态初始化类B");
}
}
class AInitRef extends AInit_FatherRef
{
public static int width = 100;//静态变量。静态域 field
final static int MAX = 100;
static
{
System.out.println("静态初始化类AInit");
width = 30;
}
public AInitRef()
{
System.out.println("创建AInit类的对象");
}
}
class AInit_FatherRef{
static{
System.out.println("静态初始化AInit_Father");
}
}
JVM类载入过程及主动引用与被动引用的更多相关文章
- jvm学习002 虚拟机类加载过程以及主动引用和被动引用
虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类从被加载到虚拟机内存中开始,到卸载出内存为 ...
- Java中对类的主动引用和被动引用
1.遇到new,getstatic,putstatic,invokestatic这4条字节码指令时,类如果没初始化就会被初始化,创建对象,读取或设置静态字段,调用静态方法. 2.反射 3.子类初始化前 ...
- [读书笔记]Java类载入过程
一. 类的生命周期 类从被载入到虚拟机内存中開始,到卸载出内存为止,有下面(如图)的生命周期: 以上"载入->验证->准备->解析->初始化"称为类的载入过 ...
- JVM 类加载过程、初始化、主动引用、被动引用、静态初始化块执行顺序
- finalkeyword对JVM类载入器的影响
众所周知,当訪问一个类的变量或方法的时候.假设没有初始化该类.就会先去初始化一个类 可是,当这个类的变量为final的时候,就不一定了 请看以下的样例 package com.lala.shop; i ...
- JVM系列文章(四):类载入机制
作为一个程序猿,只知道怎么用是远远不够的. 起码,你须要知道为什么能够这么用.即我们所谓底层的东西. 那究竟什么是底层呢?我认为这不能一概而论.以我如今的知识水平而言:对于Web开发人员,TCP/IP ...
- jvm载入过程
类载入过程 类从被载入到虚拟机内存中開始,到卸载出内存为止,它的整个生命周期包含:载入.验证.准备.解析.初始化.使用和卸载七个阶段.它们開始的顺序例如以下图所看到的: 当中类载入的过程包含了载入.验 ...
- 深入研究Java类载入机制
深入研究Java类载入机制 类载入是Java程序运行的第一步,研究类的载入有助于了解JVM运行过程,并指导开发人员採取更有效的措施配合程序运行. 研究类载入机制的第二个目的是让程序能动态的控制类载 ...
- java类载入器——ClassLoader
Java的设计初衷是主要面向嵌入式领域,对于自己定义的一些类,考虑使用依需求载入原则.即在程序使用到时才载入类,节省内存消耗,这时就可以通过类载入器来动态载入. 假设你平时仅仅是做web开发,那应该非 ...
随机推荐
- DevExpress GridControl 中下拉框联动效果的实现(及支持文本框录入情况)
先解释一下标题: grid中的某一列默认为文本框,根据需要动态的变更为下拉框,且支持动态变更数据源 需求是这样的: 有一些参数(A),这些参数又分别对应另外的参数(B),所以,先把A作为一列,B根据A ...
- sharepoint给文档库每个数据条添加权限
前言 老大任务,做一个读取文档库把里面的每一条数据添加权限.挺起来很简单,但是做起来,还是很简单,哈哈.因为我没有接触过这些代码,所以得不断的请教了.大题明白了,简单实现了一下,应用控制台先做了一下简 ...
- 搭建laravel5全面教学,爬坑(windows下)。
1.首先下载屌比的Composer 2.然后下载composer.phar 3.然后下载最新版Laravel框架 4.将下载下来的laravel压缩包扔到htdocs目录下(扔到别的目录没试过) 5. ...
- ThinkPHP表单令牌验证功能详细介绍
注:TP版本为3.1.3 在ThinkPHP框架下,两次提交同一个表单,比如提交信息后在浏览器点击后退退回上次的页面,重新点击提交按钮,就会提示“表单令牌错误”的信息. ThinkPHP新版内置了表单 ...
- Jquery常用功能
jQuery 1.4给开发者带来了很多值得兴奋的新特性,同时使用jQuery的人也越来越多,为了方便大家对jQuery的使用,下面列出了一些jQuery使用技巧.比如有禁止右键点击.隐藏搜索文本框文字 ...
- odoo 错误 Resource interpreted as Stylesheet but transferred with MIME type application/x-css:
odoo8 页面内容显示一半, web 控制台显示错误 Resource interpreted as Stylesheet but transferred with MIME type ap ...
- 一种轻量的openresty路由设计
在使用openresty开发接口的过程会发现一个问题,那就是接口的地址问题怎么解决,最好一个接口地址对应一个lua文件,也可以在nginx.conf 配置中使用content_by_lua 来编写接口 ...
- 转】VB中Set的用法
Set 语句 将对象引用赋给变量或属性. 语法 Set objectvar = {[New] objectexpression | Nothing} Set 语句的语法包含下面部分: 部分 描述 ob ...
- UFLDL教程(五)之self-taught learning
这里所谓的自学习,其实就是利用稀疏自编码器对无标签样本学习其特征 该自学习程序包括两部分: 稀疏自编码器学习图像特征(实现自学习)---用到无标签的样本集 softmax回归对样本分类---用到有标签 ...
- SecureCRT 颜色
默认的情况下,SecureCRT 是没有颜色方案的. 也就是说:用vim,你是看不到色彩显示效果,用ll 文件和文件夹也不会有颜色区别. 那如何支持颜色显示呢?方法如下: www.2cto.com ...