理解Java虚拟机(2)之.class文件加载过程

本文是《深入理解Java虚拟机》读书笔记,详细介绍了.class文件加载过程,包括加载、验证、准备、解析和初始化阶段。加载由ClassLoader完成,遵循双亲委派模型。验证确保.class文件符合JVM规范,准备阶段为类变量分配内存并设置初始值,解析阶段将符号引用替换为直接引用。初始化阶段执行类定义的代码,开始程序的实际运行。
摘要由CSDN通过智能技术生成

理解Java虚拟机(2)之.class文件加载过程

读《深入理解Java虚拟机》-周志明 读书笔记

虚拟机只能执行.class文件,在.class文件加载过程中,生命周期包括:加载,验证,准备,解析,初始化使用卸载

image

  • 加载将.clss文件加载进虚拟机,加载来源有

    • 1.常见jar包;
    • 2.网络获取(dubbo的RPC是典型,底层通过java的RMI方法,通过固定协 议,将远端生成者接口,对象序列化,消费者调用);
    • 3.运行时动态生成,典型代表反射技术;
    • 4.从其他文件,如jsp;
    • 5.通过数据库读取,(没见到过,书里说中间件服务器)

    加载完成后,虚拟机就会按照.class文件里面的内容相应的存储到内存的方法区(方法区是虚拟机加载类信息,常量,静态变量,即使编译后的代码,是线程共享的,简单讲就是加载的东西放在这里面),加载是通过ClassLoader这个加载,这个加载机制是通过(双亲委派模型,后面详细讲双亲委派模型,简单讲就是JVM有一个系列的继承加载,自己也可以自定义ClassLoader,先通过自己的ClassLoader,在通过JVM的ClassLoader),平常使用Tomcat,Jetty,这些容器都是有自己的ClassLoader,用过maven配置jetty启动时,都会在pom.xml配置标签,这个就是去配置jetty的ClassLoader。

  • 验证
    验证是连接阶段的第一步,并不是加载完了才验证(这样的太傻瓜式了,要是很多.class文件,在最开始加载就有错误,等加载完了再验证那就不用工作了),验证和加载是相辅相成的。在.java编译成.class文件里讲过.class打头就是个”cafebabe”的魔数,首先验证这个,不是这个打头的必然报错,接着看看版本号,版本号是不是java没有的(比方搞个java6.0,必然错了),然后看常量类型啊,验证相当于看这个.class文件是否符合JVM规范,用过Eclipse的就知道,每次”ctrl+s”就能看到自己写的代码有没有错误,因为eclipse就是有自己的CLassLoader,即时编译,你一保存就给你编译了.class,打开文件夹就能看到class目录的文件夹,然后通过去验证编译后的.class是不是符合JVM规范,然后错了就各种红叉叉,iead就没有即时编译,”ctrl+s”就找不到对应的class文件夹,eclipse的验证不是虚拟机的验证,这只是eclipse自己根据jVM规范验证的,编译后的.class文件JVM在加载的过程中,还是要自己验证的,不过虚拟机有个参数可以设置不验证(-Xverify:none),这样可以加快加载速度,当然前提是你相信.class符合规范,验证是很重要的一件事,不然怎么承受恶意的攻击,使得代码更安全,当然验证也会使得加载时间长,在安全和时间上,还是选择更安全些,毕竟java大都都是用来做企业级应用的,安全是最重要的。

  • 准备
    准备阶段是正式给类变量(static修饰的变量)分配内存并设置类变量的初始值,实例变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值