`
wang7839186
  • 浏览: 40761 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jvm学习第四天

    博客分类:
  • java
阅读更多

继续jvm的学习,昨天学习了根据十六进制的class文件分析还原类结构,今天学习类加载的过程

一、类加载的过程

1、加载(类加载过程中的其中一个过程)

(1)通过一个类的全限定名来获取定义此类的二进制字节流

(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

(3)在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口

 

虚拟机规范的这三点并不具体,例如通过全限定名才获取字节流,并没有限制获取的方式,在此基础上,可以自定义类加载器,或者从jar、ear、war等格式读取,也可以运行时计算生成,典型的场景就是代理技术,或者还可以由其他文件生成,比如说jsp。

 

2、验证

验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

 

大都会完成下面四个阶段的检验过程:文件格式验证、元数据验证、字节码验证、符号引用验证

 

(1)文件格式验证:验证字节流是否符合Class文件格式的规范,并且能够被当前版本的虚拟机处理。经过这个阶段的验证后,字节流才会进入内存的方法区中进行存储,所以后面的三个验证阶段全部是基于方法区的存储结构进行的。

(2)元数据验证:对字节码描述的信息进行语义分析,以保证符合java规范,例如检查是否继承了不允许继承的类

(3)字节码验证:进行数据流和控制流分析,对类的方法体进行校验分析,例如子类和父类的类型转换

(4)符号引用验证:对类自身以外的信息进行匹配性的校验,例如引用中的类、字段和方法的访问性是否可被当前类访问

 

3、准备

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。

首先,这时候进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在java堆中。其次是这里所说的初始值通常情况下是数据类型的零值。

 

4、解析

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程

 

5、初始化

类初始化阶段是类加载过程的最后一步,开始执行类中定义的java程序代码

 

二、类加载器

虚拟机设计团队把类加载阶段中的通过一个类的全限定名来获取描述此类的二进制字节流这个动作放到java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块被称为类加载器。

1、类与类加载器

类加载器虽然只用于实现类的加载动作,但它在java程序中起到的作用却远远不限于类加载阶段。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在java虚拟机中的唯一性。比较两个类是否相等,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使他们来源于同一个class文件,只要他们的类加载器不同,那这两个类就必定不相等。

2、双亲委派模型

站在虚拟机的角度讲,只存在两种不同的类加载器:一种是启动类加载器,这个类加载器使用C++语言实现,是虚拟机滋生的一部分;另外一种就是所有其他的类加载器,这些类加载器都有java实现,独立于虚拟机之外,并且全部继承自抽象类java.lang.ClassLoader。

 

类加载器之间的关系是启动类加载器--扩展类加载器--应用程序类加载器

 

工作工程:如果一个类加载器收到了加载类的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父加载器,因此最终的加载请求都会委派到顶层的启动类加载器中,只有当父加载器反馈自己无法加载这个类时,子加载器才回去尝试自己加载。

 

双亲委派模型的好处是java类随着它的类加载器一起具备了一种带优先级的层次关系。例如java.lang.Object类,他存放在rt.jar中,无论哪个类加载器要加载这个类,最终都委派给启动类加载器加载,所以Object在程序各种类加载环境中都是同一个类,保证了java类型体系中最基础的行为。

 

0
2
分享到:
评论
1 楼 truth99 2012-12-21  
京晶啊 在这也能碰到你啊 呵呵

相关推荐

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)算法 第五节:垃圾回收器 1.1Serial/Serial Old收集器 1.2 ParNew收集器 1.3Parallel Scavenge收集器 1.4Parallel Old收集器 1.5CMS...

    Java进阶教程解密JVM视频教程

    第四章:类加载与字节码技术 1. 类文件结构 2. 字节码指令 3. 编译期处理 4. 类加载阶段 5. 类加载器 6. 运行期优化 第五章:内存模型 1. Java 内存模型 2. 可见性 3. 有序性 4. CAS 与原子类 5. synchronized 优化

    一次性精通JVM JAVA虚拟机

    为什么要学JVM 1、一切JAVA代码都运行在JVM之上,只有深入理解虚拟机才能写出更强大的代码,解决更深...第4章 内存模型,本章节涵盖JVM内存模型的全部内容,程序计数器、虚拟机栈、本地方法栈、方法区、永久代、元空间

    Java 并发编程原理与实战视频

    第4节学习并发的四个阶段并推荐学习并发的资料 [免费观看] 00:09:13分钟 | 第5节线程的状态以及各状态之间的转换详解00:21:56分钟 | 第6节线程的初始化,中断以及其源码讲解00:21:26分钟 | 第7节多种创建线程的...

    JAVA核心知识点全集

    第一章:jvm、第二章:java集合、第三章:java多线程并发、第四章:java基础、第五章:Spring原理、第六章:微服务、第七章:Netty 与 RPC、第八章:网络、第九章:日志、第十章:Zookeeper、第十一章:Kafka、第十...

    深入Java虚拟机(原书第2版)及书中源代码

    第4章 网络移动性 第5章 Java虚拟机 第6章 Java class文件 第7章 类型的生命周期 第8章 连接模型 第9章 垃圾收集 第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章...

    java jdk8 学习笔记

    第一章 1.Java 编程语言刚开始 Oak 橡树 办公室外 已被注册 边喝咖啡边讨论名称 2.动态加载类别文档、字符串池(String Pool)等特性为节省内存而设计 3.jdk java development kit java 开发工具集 java se 平台...

    Java中高级核心知识全面解析(高频面试题) 中文PDF完整版

    第四部分 数据结构与算法 第五部分 数据库(MySQL+Redis) 第六部分 系统设计(RestFul API+常用框架+认证授权+分布式+大型网站架构+微服务) 第七部分 必会工具(Git+Docker) 第八部分 面试指南(简历应该如何写+...

    基础的java学习,学习过程的蜗牛,不断前行.rar

    这套教程适用于没有任何 Java 基础,或者基础薄弱的学员,它通俗易懂,并且非常全面,30-50 天从入门到精通不是神话。 第1章 Java入门基础及环境搭建 1.Java是什么 2.Java JDK下载与安装教程 3.Java JDK环境变量...

    IBM SDK Java V8用户指南中文版(2019)

    IBM SDK Java Technology Edition V8用户指南中文版的PDF文档,共计364页,可以系统性的了解及学习IBM Java8及其相关的IBM Java虚拟机JVM,有助于优化项目和银行业相关实施运维工作 第1章:产品概述 第2章:迁移 ...

    java面试笔试资料包括JAVA基础核心知识点深度学习Spring面试题等资料合集.zip

    第四题 ArrayList LinkedList Vector的区别.pdf docker讲得最清楚.doc Dubbo是什么?能做什么?.doc java 基于TCP协议的Socket编程和通信.doc Java面试高级篇—说说TCP,UDP和socket,Http之间联系和区别.doc MySQL...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《Java JDK 7学习笔记》详细介绍了JVM、JRE、Java SE API、JDK与IDE之间的对应关系。必须要时从Java SE API的源代码分析,了解各种语法在Java SE API中如何应用。  《Java JDK 7学习笔记》将IDE操作纳为教学内容...

    java是什么.avi

    java学习第一天,讲解java是什么 本章学习要点 了解 Java 语言的版本及特点 了解学习 Java 的方法 掌握 JDK 的安装 掌握环境变量的配置 熟悉 Java 程序的编写、编译和运行过程 了解 Java 虚拟机的作用 熟悉 Java ...

    大优惠 Java程序性能优化 让你的Java程序更快、更稳定最新版

    第4章介绍了并行开发和如何通过多线程提高系统性能。第5章立足于JVM虚拟机层面,介绍如何通过设置合理的JVM参数提升Java程序的性能。第6章为工具篇,介绍了获取和监控程序或系统性能指标的各种工具,包括相关的故障...

    Java程序性能优化

    第4章介绍了并行开发和如何通过多线程提高系统性能。第5章立足于JVM虚拟机层面,介绍如何通过设置合理的JVM参数提升Java程序的性能。第6章为工具篇,介绍了获取和监控程序或系统性能指标的各种工具,包括相关的故障...

    java后端学习推荐书籍清单

    《深入理解Java虚拟机:JVM高级特性与最佳实践》 《深入理解计算机系统(原书第三版》《Netty权威指南 第2版》 《Netty 4核心原理与手写RPC框架实战》 《MyBatis技术原理与实战》 《大话设计模式》 《高性能MySQL》 ...

    JAVA-Study:JAVA学习

    第4周的任务:控制门 第五周作业:上课 第六周:继承 第7周的任务:打包 亚军8:界面 第9周的任务:异常处理 第十周:多线程编程 第11周的任务:枚举 第12周的作业:注释 第13周的挑战:I / O 第14周的任务:泛型 ...

    小白的20天Java学习打卡day3

    太原理工大学机器人团队20天学习打卡day3 1、数据类型​ ①数据类型的作用 程序当中有很多数据,每一个数据都是有相关类型的,不同数据类型的数据...第四类:字符型 char 注意:字符串不属于基本数据类型,属于引用

    大数据工程师学习计划.pdf

    如果你对⼤数据开发感兴趣,想系统学习⼤数据的话,可以加⼊⼤数据技术学习交流扣群:数字4583+数字45782,私信管理员即可免费 领取开发⼯具以及⼊门学习资料 针对以上主要的4个特征我们需要考虑以下问题: 数据...

Global site tag (gtag.js) - Google Analytics