码迷,mamicode.com
首页 > 其他好文 > 详细

JVM 类的加载机制

时间:2017-06-21 18:56:18      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:blog   .class   静态   变量赋值   bsp   1.2   str   动作   引用   

在对类的实例化之前。JVM 一般会先进行初始化

主要经过如下几个阶段:

技术分享

  1.加载                      

类加载的第一阶段,类加载时机有两个:

1.预加载:当虚拟机启动时,会预加载HOME/lib下的rt.jar里的.class文件

里面包括java.lang.*java.util.*java.io.*

还有加载当前启动类并调用main方法

2.运行时加载:

首先会去内存中找.class文件有没被加载,没有的话就会按照类的全限定名进行加载

 

加载(load)阶段.

1.1获取类的二进制流文件

1.2将类的信息、常量、静态变量存到方法区(的运行时常量池)

1.3在内存中生成该.class文件的java.lang.class对象,作为方法区内这个类的数据访问入口.(HotSpot 比较特殊,他把class对象存到方法区中)

  2.验证                      

确保.class文件中的字节流信息能够被正确的加载并不会危害到虚拟机的安全

 

  3.准备                      

类的静态变量分配内存并赋初始值.这时候分配内存的仅仅是静态变量,实例变量会随着类的实例化一起存储在堆内存中

int声明的默认为0.final修饰变量直接赋值

例:public static int a=3;

public static final int b=3;

在准备阶段a的值是0,而a赋值为3putstatic指令是在程序编译后存放于类构造器<clinit>()方法之中的,所以把a赋值为3的动作将在初始化阶段才会执行,b就直接赋值为3

 技术分享

  4.解析                      

将符号的引用变为直接引用

这个涉及到编译原理,符号的引用一般有以下三个常量:

1.类的全限定名

2.方法的名称和描述符

3.字段的名称和描述符

直接引用可以是直接指向目标的指针、相对偏移量或是一个能间接指向目标的句柄

 

 

  5.初始化                                                          

真正执行java字节码的过程..初始化过程是执行一个类初始化构造器<client>init()的过程

说白了就是为被static修饰的变量赋于程序指定的值并执行静态代码块

 

类初始化时机:只有当对类的主动使用的时候才会导致类的初始化,类的主动使用包括以下六种:

– 创建类的实例,也就是new的方式

– 访问某个类或接口的静态变量,或者对该静态变量赋值

– 调用类的静态方法

– 反射(如Class.forName(“com.shengsiyuan.Test”))

– 初始化某个类的子类,则其父类也会被初始化

– Java虚拟机启动时被标明为启动类的类(Java Test),直接使用java.exe命令来运行某个主类

 

http://www.cnblogs.com/xrq730/p/4844915.html参考链接:

 

JVM 类的加载机制

标签:blog   .class   静态   变量赋值   bsp   1.2   str   动作   引用   

原文地址:http://www.cnblogs.com/zewen/p/7061232.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!