`
wupuyuan
  • 浏览: 77400 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JVM学习笔记之CLASS结构和动态链接模型

阅读更多

 

    之前分析了方法调用和运行的过程,基本上可以满足代码层的需求了,不过为了更好的理解调用和运行的过程,还是分析下CLASS文件的结构和他动态链接的模型。

    首先还是得看下CLASS文件的结构。CLASS文件的结构分为(只列了简单的总结,我目前也用不到太深入的):
1.magic(魔数):是一个定值0xCAFEBABE,不是它开头的文件就不是CLASS。为什么是这么个数呢?据说是巧合,我们不管它。它是JVM校验一个JAVA文件的第一个步骤。

2.minor_version 和 major_version : CLASS的版本号,用于标识支持的JDK的版本范围。比如JDK1.5编译出的CLASS文件是不能被更早的JDK加载的。

3.constant_pool_count 和 constant_pool : 常量池,记录了文字字符串、final值、类名和方法名的常量。在常量池之前是入口在列表中的计数器。 常量池在java动态链接的过程中有十分重要的作用。一个CLASS文件都有自己的常量池,但是很少资料说常量池在内存中的哪。我推测是在方法区。(不过对于写代码来说无关紧要)

4.access_flags : 对应成代码就是标记的接口还是类,是不是final 、 抽象等。

5.this_class : 是对常量池的索引,简单来说就是让JVM知道这个CLASS对应的常量池范围。

6.super_class : 顾名思义,父类的信息,依然是个常量池的所以,只不过这里标记的是父类对应的常量池范围。

7.interfaces_count 和 interfaces : interfaces_count是实现的接口数量,紧跟着的interfaces是实现的接口数组,包含每个接口对应的常量池索引。

8.fields_count 和 fields : 自身CLASS文件的类变量+实例变量的总数 和 对应的序列表

9.methods_count 和 methods : 自身CLASS文件的所有方法总数 和 对应的序列表

10.attributes_count 和 attributes : CLASS属性,介绍有很多,简单来说就是内部类和非内部类InnerClasses和SourceCode。

    每个CLASS文件在加载到内存的时候,都是保存在方法区。加载到方法区后,主要的属性就是属性表、方法表、常量池。

    弄清楚了CLASS结构以后就可以看看在JVM中,不同的文件是怎么链接到一起的了。
    JVM编译一个java程序的时候,会得到程序中每个类(或者接口)的class文件,这些CLASS文件通过接口(harbor)符号相互关联,在JVM运行时,动态的将这些接口符号组织成链接CLASS的网。
   之前说过CLASS包含一个很重要的部分,常量池,所有的接口符号就是保存在这里的。每个CLASS都有一个常量池,每个被JVM加载的CLASS有个自己的内部常量池,或者说运行时常量池。当CLASS刚刚被加载的时候,运行时常量池存储的就是刚刚说的接口符号(harbor),当程序运行到一个时间点,需要调用某个类时,JVM将解析运行时常量池的接口符号,根据符号引用查找到实体(每个CLASS在JVM加载后都会保存在方法区中的某个位置,在运行前不知道某个具体的CLASS将会被加载到内存中的具体地址),再把符号引用替换成直接引用的过程。又因为符号都保存在常量池中,这一步骤也称为常量池解析。

    常量池解析是在运行前就知道了将要链接的CLASS,在代码里可以认为是 Object o = new Object()这样。不过JVM也可以在运行时决定链接某一类型(反射),比如Class.forName()和用户自定义装载器loadCLass()等方法。这种动态运行是才决定链接具体的CLASS的功能,可以调用在代码中没有提及的类型,所以很灵活,当然所带来的开销也很大,自然反射的效率要低于new的效率。
由此可见在灵活和效率上,程序不能兼顾,不能所有的地方都采用反射来创建。

    之后在装载时还会有一系列的解析和校验的过程。不过步骤都比较统一,过程也很死板,人为干预不了,对于代码优化来说没有太大意义,这里就不详细列举了。不过有个地方我觉得还是值得看一下,就是装载类时的双亲委派模型
    理解这个模型首先也得理解Java术语中的初始类装载器和定义类装载器。JVM中的Class装载器是相互委托的,比如在要求某个类装载器去装载一个类型,结果返回的是其他类装载器装载的类型。比如门面模式经常可以看到。所以在加载CLASS时一般通过委派先递归到系统装载器,若系统装载器不能装载这个类型,则控制权返回给自定义的加载器来加载。双亲模型说白了就是先系统JDK加载器加载,再用户自定义加载。这种模式的好处还是灵活。
    举个例子,如果按JDK1.2以前的模型来看,现在想要加入脚本语言比如ruby、groovy等,一定得等到JDK加入相关的加载类才能使用,而现在只需要有对应的第三方jar即可使用了。
    
    至此,我的《深入JVM虚拟机》的学习告一段落,现在写代码用到的只有这么多,希望能有更好的环境让我研究下去。也希望牛人能来拍拍砖。


2
7
分享到:
评论
2 楼 g29times 2012-05-19  
真好 学习了
1 楼 沙和尚 2012-04-21  
你好,请教一个字符串的问题
public class A {
        public String x = "data";
}
public class B {
    public String y = "data";
}
AB这两个类里面的"data"字符串应该都是存在class文件的常量池中,载入jvm的常量池之后
应该是A类"data"存到A类的运行时常量池中,B类的"data"存放到B类的运行时常量池中,但是为什么
A.x == B.y
这个会是true啊?求解

相关推荐

    JVM学习笔记(一)

    ### JVM学习笔记(一) #### 一、JVM概述与工具使用 JVM(Java Virtual Machine)是Java语言的核心组成部分之一,它为Java程序提供了一个跨平台的运行环境。本篇学习笔记主要介绍如何利用一系列工具来查看和监控JVM...

    JVM学习笔记

    ### JVM学习笔记 #### JVM内存模型 (JMM) JVM内存模型主要分为以下几个部分: - **Java堆**:这是所有线程共享的一块区域,在虚拟机启动时创建。主要用于存放对象实例,几乎所有的对象实例都在这里分配内存。 - *...

    java之jvm学习笔记五(实践写自己的类装载器)

    这个“java之jvm学习笔记五(实践写自己的类装载器)”很可能是对这一主题的详细探讨。 类装载器在Java中的主要职责是动态加载类到JVM中。Java的类装载器分为三个基本层次:启动类装载器(Bootstrap ClassLoader)、...

    JVM学习笔记核心知识点整理

    ### JVM学习笔记核心知识点整理 #### 一、引言与背景 随着软件开发技术的不断发展,Java作为一种广泛应用的编程语言,其背后的核心技术——Java虚拟机(JVM)的重要性日益凸显。掌握JVM不仅可以帮助开发者更好地理解...

    Java分布式应用学习笔记02再谈JVM

    ### Java分布式应用学习笔记02再谈JVM 在深入探讨Java虚拟机(JVM)时,我们再次聚焦于这个核心组件,它不仅是Java运行环境的心脏,也是构建分布式应用的关键技术之一。JVM作为Java语言的核心执行环境,其设计与...

    6.1.1.JVM前奏篇笔记1

    总的来说,了解JVM的工作原理、类文件的结构以及编译过程对于Java开发者来说至关重要,因为这能帮助我们更好地优化代码、理解和解决问题,从而提高程序的运行效率和稳定性。通过学习这些知识,我们可以深入探究Java...

    Java,JVM相关笔记的代码知识

    这份JVM相关的笔记包含了深入理解JVM内部工作机制的关键代码资源,是学习和优化Java应用程序的重要参考资料。下面,我们将深入探讨Java与JVM的相关知识点。 1. **类加载机制**:JVM通过类加载器(ClassLoader)将...

    ImagesForJVM-JVM笔记图片

    【描述】"ImagesForJVM——JVM笔记图片" 暗示这些图片可能是教学或学习笔记的一部分,旨在通过视觉化的方式解释JVM的关键概念,如内存模型、类加载机制、垃圾收集以及性能优化等方面。 【标签】"java" 明确了这些...

    深入Java虚拟机JVM类加载学习笔记

    ### 深入Java虚拟机JVM类加载学习笔记 #### 一、Classloader机制解析 在Java虚拟机(JVM)中,类加载器(ClassLoader)是负责将类的`.class`文件加载到内存中的重要组件。理解类加载器的工作原理对于深入掌握JVM以及...

    JVM成神之路笔记整理版

    8. **JVM内存溢出与异常**:学习如何识别和处理常见的JVM错误,如OOM(Out Of Memory)错误,以及如何通过调整JVM配置避免这些问题。 9. **JDK和JRE**:JDK包含JRE和开发工具,如编译器javac和调试器jdb。JRE则包含...

    韩顺平编写的java学习笔记(全)

    韩顺平编写的《Java学习笔记》全面涵盖了Java的基础知识和发展方向,不仅适合初学者入门,也适合进阶开发者深入了解Java的各项技术栈。通过对本书的学习,读者能够掌握Java的核心概念、编程技巧以及实际应用场景,为...

    JVM学习笔记(一)——类的加载机制

    Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是类加载机制。类加载机制负责将Java源代码编译成的.class文件转换为内存中的数据结构,以便程序可以执行。本篇将深入探讨类加载机制的原理和过程。 ...

    java校招学习笔记

    7. **反射机制**:运行时动态获取类信息并操作对象的能力,包括Class类、Constructor、Method和Field的使用。 8. **JVM内存模型**:理解堆、栈、方法区、本地方法栈和程序计数器,以及垃圾回收机制。 9. **设计...

    Java公司培训经典学习笔记

    Java公司培训经典学习笔记是针对Java编程语言进行深入学习的一份宝贵资料,涵盖了从基础到高级的诸多知识点,旨在帮助开发者提升技能,适应企业级项目开发的需求。以下将详细阐述这些笔记中的关键点: 1. **Java...

    java学习笔记之大鹏JAVA终级总结

    Java学习笔记之大鹏JAVA终级总结,是针对Java编程语言深入学习和面试准备的一份综合资料。这份总结涵盖了从基础知识到高级概念的多个方面,旨在帮助初学者理解和掌握Java的核心概念,同时解决面试中可能出现的关键...

    java面试题 学习笔记

    本篇将基于常见的Java面试问题,结合学习笔记,深入探讨Java的核心概念和技术。 一、Java基础 1. Java的特性:了解Java的“一次编写,到处运行”的平台无关性,以及它的面向对象特性,如封装、继承和多态。 2. 类与...

    学习笔记之对象的创建(Java)

    ### 学习笔记之对象的创建(Java) #### Java技术与Java虚拟机 Java作为一种广泛使用的编程语言,其独特之处在于“一次编写,到处运行”的理念。这一特性主要得益于Java虚拟机(JVM)的存在。Java技术主要包括以下几...

    java se学习笔记

    【Java SE学习笔记】是针对Java初学者的一份详实的学习资源,主要涵盖了Java的基础知识、进阶概念以及编程实践。这份笔记以HTML格式呈现,方便读者在线阅读或下载后离线浏览。以下是对这份笔记可能包含的重要知识点...

    CoreJava学习笔记.doc

    《CoreJava学习笔记》 Java,作为一种广泛使用的高级编程语言,以其独特的特性和优势深受开发者喜爱。本学习笔记旨在深入浅出地介绍Java的核心概念,帮助初学...希望这份学习笔记能为你的Java学习之路提供有效的帮助。

    JVM学习资料(zzm版3).rar

    《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)周志明.pdf》这本书是Java开发者深入理解JVM(Java Virtual ...而“新建文本文档.txt”可能包含个人笔记或者临时记录,对于JVM学习的具体内容没有直接关系。

Global site tag (gtag.js) - Google Analytics