<深入理解 Java 虚拟机>学习 -- 类加载机制 1. 概述 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制. 2. 类加载的时机 2.1 类的生命周期: 加载 --> 连接(验证 --> 准备 --> 解析)--> 初始化 --> 使用 --> 卸载 其中,加载.验证.准备.初始化和卸载这五个阶段的顺序是确定的,类的加载过程必须按照这种顺序…
从java的动态性到类加载机制   我们知道,Java是一种动态语言. 那么怎样理解这个“动态”呢? 或者说一门语言具备了什么特性,才能称之为动态语言呢? 对于java,我是这样理解的. 我们都知道JVM(java虚拟机)执行的不是本地机器码指令, 而是执行一种称之为字节码的指令(存在于class文件中). 这就要求虚拟机在真正执行字节码之前,先把相关的class文件加载到内存中. 虚拟机不是一次性加载所有需要的class文件,因为它在执行的时候根本不会知道以后会用到哪些class文件. 它是每…
1 什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并向程序员提供了访问方法区内的数据结构的接口. 2 类的生命周期 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading).验证(Verification).准备(Pre…
一.前言 当在CMD/SHELL中输入 $ java Main<CR><LF> 后,Main程序就开始运行了,但在运行之前总得先把Main.class及其所依赖的类加载到JVM中吧!本篇将记录这些日子对类加载机制的学习心得,以便日后查阅.若有纰漏请大家指正,谢谢! 以下内容均基于JDK7和HotSpot VM. 二.执行java的那刻   大家都知道通过java命令来启动JVM和运行应用程序,但实际的流程又是如何的呢? 1. 首先根据java后的运行模式配置项或<JAVA_H…
这是Java基础篇(JVM)的第二篇文章,紧接着上一篇字节码详解,这篇我们来详解Java的类加载机制,也就是如何把字节码代表的类信息加载进入内存中. 我们知道,不管是根据类新建对象,还是直接使用类变量/方法,都需要在类信息已经加载进入内存的前提下.在Java虚拟机规范中,类加载过程也就是类的生命周期包括7个部分:加载.验证.准备.解析.初始化.使用.卸载.不过我们先不写这几个阶段,先讲讲类加载器的知识,然后再来看具体的类加载过程. 1. 类加载器 关于类加载器,我主要关注两个方面,一是类加载器的…
本文源码:GitHub·点这里 || GitEE·点这里 一.类加载简介 类的加载机制是指把编译后的.class类文件的二进制数据读取到内存中,并为之创建一个java.lang.Class对象,用来封装类在元数据空间的数据结构. 类在JVM中的生命周期为:加载,连接,初始化,使用,卸载.不过这里只重点描述加载,连接,初始化这三个过程. 二.加载过程 基于一张图看类加载子系统的细节流程: 1.加载阶段 过程描述 加载阶段需要完成以下三个过程: 通过类的全限定名来获取其定义的二进制字节流: 将字节流…
类加载的时机   类加载的生命周期为: 加载.验证.准备.解析.初始化.使用.卸载七个阶段,其中验证.准备.解析三个阶段统称为连接.其中加载与连接时交叉执行的. 类必须初始化的六种情况 遇到new.getstatic.putstatic.或者invokestatic这四条字节码指令时,如果类型没有进行过初始化,则需先触发其初始化阶段. 使用java.lang.reflect包的方法对类型进行反射调用的时候,如果类型没有进行过初始化,则需先触发其初始化阶段. 当初始化类的时候,其父类还没有初始化,…
形参和实参 我们知道,在Java中定义方法时,是可以定义参数的,比如: public static void main(String[] args){ } 这里的args就是一个字符串数组类型的参数. 在程序设计语言中,参数有形式参数和实际参数之分,先来看下它们的定义: 形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数,简称"形参". 实际参数:在主调函数中调用一个函数时,函数名后面括号中的参数称为"实际参数",简称"…
1.java的运行机制 java的编译过程,将java的源程序(扩展名为.java的文件),由java编译程序将java的字节码文件(.class文件)在jvm上运行,机器码有cpu运行, jvm编译后是字节码,电脑只能运行字节码,则在java的运行的过程中将字节码转换成机器码 .java(源) -> .class(编译后) ->机器码(运行后) 2.c语言的运行机制 c语言的编译过程是将c语言源程序(也就是.c文件),经过编译程序编译后,生成windows可执行文件,然后在windows中执…
1.自动装箱与拆箱的定义 装箱就是自动将基本数据类型转换为包装器类型(int-->Integer): 拆箱就是自动将包装器类型转换为基本数据类型(Integer-->int). Java中的数据类型分为两类:一类是基本数据类型,另一类是引用数据类型.如下图: 基本类型 二进制位数 分装类 int 32(4字节) Integer byte 8(1字节) Byte long 64(8字节) Long short 16(2字节) Short float 32(4字节) Float double 64…