各位读者好! 在JVM系列的上一篇文章中,开发人员了解了Java虚拟机(JVM)及其体系结构。 本教程将帮助开发人员正确回答以下主题的问题:

  • ClassLoader子系统
  • 运行时数据区

1.简介

在继续之前,让我们看一下Java虚拟机及其基本特征。

1.1什么是Java虚拟机(JVM)?

Java虚拟机(JVM)是​​驻留在您的计算机上的抽象虚拟机,并为Java字节码提供了运行时环境以供执行。 JVM可用于许多硬件和软件平台,但是很少有Java开发人员知道Java运行时环境 (JRE)是Java虚拟机 (JVM)的实现。 JVM分析字节码,对其进行解释,然后执行相同的字节码以显示输出。

JVM的基本功能是执行已编译的.class文件(即字节码)并生成输出。 请注意 ,每个操作系统都有一个不同的JVM,但是在所有操作系统上生成的字节码输出都是相同的。 这意味着在Windows操作系统上生成的字节码也可以在Linux操作系统上运行,反之亦然,从而使Java成为独立于平台的语言。

图1:Java虚拟机概述

1.1.1 JVM做什么?

Java虚拟机执行以下操作:

  • 加载所需的.class和jar文件
  • 分配参考并验证代码
  • 执行代码
  • 为Java字节码提供运行时环境

1.1.2 JVM内部架构

下图显示了符合JVM规范的Java虚拟机的关键内部组件。

图2:Java虚拟机架构

下面分别解释图2中所示的类加载器和运行时数据区域组件。

1.2 ClassLoader子系统

类加载器子系统是Java虚拟机的基本核心,用于加载/读取.class文件并将字节码保存在JVM方法区域中。 该子系统处理动态类加载功能,并执行三个主要功能,即:

  • 加载 :此组件处理将.class文件从硬件系统加载到JVM内存并存储二进制数据(例如完全限定的类名,直接父类名,有关方法,变量,构造函数的信息等)。在方法领域。 对于每个已加载的.class文件,JVM会立即在堆存储器上创建一个类型为java.lang.class的对象。 请记住 ,即使开发人员多次调用一个类,也只会创建一个类对象。 类加载器主要有三种类型:

    • Bootstrap或Primordial ClassLoader该类加载器负责加载rt.jar存在的内部核心Java类以及java.lang.*包中存在的其他类。
  • 链接 :此组件执行类或接口的链接。 由于此组件涉及新数据结构的分配,因此它可能会抛出OutOfMemoryError并执行三个重要的活动:
    • 验证 :这是检查类的二进制表示形式并验证生成的.class文件是否有效的过程。
  • 初始化 :此组件执行类加载的最后阶段,在该阶段中,所有静态变量都被分配了原始值,并且静态块从父类执行到子类。 由于JVM是多线程的,因此此过程需要仔细的同步,并且某些线程可能会尝试同时初始化同一类或接口。

图3:ClassLoader子系统概述

1.2.1 ClassLoader如何在Java中工作?

Java中的类加载器以三个原则工作,即委托可见性唯一性

图4:Java中的类加载机制

  • 代表团 :据此:

    • 每当虚拟机遇到类时,JVM都会检查是否加载了指定的.class文件。
  • 可见性 :据此:
    • 应用程序类加载器可以看到父类加载器加载的类,但反之亦然,例如,如果类是由系统类加载器加载的,而稍后再次尝试使用扩展类加载器显式加载相同的类,则将抛出ClassNotFoundException 。运行。
  • 唯一性 :据此:
    • 由父类加载器加载的类应该由子类加载器需要重新加载

1.2.2如何在Java中加载类?

类加载器是分层的。 应用程序中的第一个类是借助static main()方法专门加载的。 所有后续类都可以通过静态或动态类加载技术来加载。

  • 静态类加载 :在这种技术中,类是通过new运算符静态加载的
  • 动态类加载 :在这种技术中,使用Class.forName()loadClass()方法以编程方式加载类。 两者之间的区别在于,前者在加载对象后初始化该对象,而后者仅加载该类但不初始化该对象

1.3运行时数据区

如图5所示,该子系统分为五个主要部分,即

图5:JVM运行时数据区

  • 方法区域 :此组件保存每个.class文件的类级别数据,例如元数据,常量运行时池,静态变量,方法的代码等。每个JVM只有一个方法区域,并且在所有类之间共享。 默认情况下,分配给该区域的内存是由JVM分配的,或者可以根据计算需要增加。 以下异常情况与此区域相关,即

    • 如果方法区域不满足内存分配请求,那么JVM会抛出OutOfMemory错误
  • 堆区域 :此组件是JVM内存的一部分,所有对象及其对应的实例变量和数组都存储在JVM内存中。 该内存区域是在JVM启动时创建的,并且只有一个堆区域跨多个线程共享,因为存储在该区域中的数据不是线程安全的。 如果存储在堆内存中的对象没有引用,则垃圾回收器 (即自动存储管理系统)回收该对象的内存; 此区域中的对象永远不会显式释放。 以下异常情况与此区域相关,即
    • 如果计算需要的堆空间超过可用的堆空间,那么JVM会抛出OutOfMemory错误
  • 堆栈区域 :该组件还是JVM内存的一部分,所有临时变量都存储在该内存中。 该区域具有堆栈帧,并为每个线程分配一个帧。 一旦线程执行完成,该框架也会被破坏。 堆栈区域是线程安全的,因为它不是共享资源,并且分为三个子实体,例如:
    • 局部变量数组:虚拟机使用这些局部变量在方法调用时传递参数

    以下异常情况与此区域相关,即

    • 如果线程处理要求虚拟机堆栈超出其允许的限制,则JVM会引发StackOverflow错误
  • PC(程序计数器)寄存器 :该组件保存当前正在执行的JVM指令的地址。 Java中的每个线程都有其自己的PC寄存器来保存当前执行指令的地址
  • 本机方法堆栈 :此组件用另一种语言编写,并保存本机方法信息。 Java中的每个线程都有一个单独的本机方法堆栈。 以下异常情况与此区域相关,即
    • 如果线程处理需要本机堆栈超出其允许的限制,则JVM会引发StackOverflow错误

这就是这篇文章的全部内容。 学习愉快!

2.结论

在本教程中,开发人员对虚拟机ClassLoader和Runtime Data Areas组件进行了概述。 您可以在“ 下载”部分中下载示例代码。

3.下载源代码

这是虚拟机ClassLoader和Runtime Data Areas组件的教程。

下载
您可以在此处下载本教程的源代码: JVM_Example

翻译自: https://www.javacodegeeks.com/2018/04/jvm-architecture-jvm-class-loader-and-runtime-data-areas.html

JVM体系结构:JVM类加载器和运行时数据区相关推荐

  1. jvm运行时类加载机制_JVM体系结构:JVM类加载器和运行时数据区

    jvm运行时类加载机制 各位读者好! 在JVM系列的上一篇文章中,开发人员了解了Java虚拟机(JVM)及其体系结构. 本教程将帮助开发人员正确回答以下主题的问题: ClassLoader子系统 运行 ...

  2. java中判断undefined_Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区

    前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么.虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事 ...

  3. jvm的类加载和运行时数据区和垃圾回收

    类加载过程 加载(loading) 引导类加载器 扩展类加载器 系统类加载器 1.通过一个类的全限定名获取此类的二进制字节流 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 3.在内 ...

  4. JVM基础知识整理----体系结构和运行时数据区

    JVM java概述 java体系 java程序语言 java虚拟机实现 class文件格式 java类库api 第三方类库 javaSE javaEE javaME java历史 1991年4月 J ...

  5. 一文搞懂JVM架构和运行时数据区,全网最新

    1.Java基础面试知识点 Java中==和equals和hashCode的区别 int.char.long各占多少字节数 int与integer的区别 探探对Java多态的理解 String.Str ...

  6. 想自学Java的速来!一文搞懂JVM架构和运行时数据区,满满干货指导

    前言 Java是目前应用最为广泛的软件开发平台之一.随着Java以及Java社区平台的不断壮大,Java也早已不再是简简单单的一门计算机语言了,它更是一个平台.一种文化.一个社区. 作为一个平台,Ja ...

  7. JVM内存与垃圾回收-3-运行时数据区/虚拟机栈/RA(返回地址)

    是什么 虚拟机栈/栈帧/RA 正常退出:调用方法PC寄存器的数值即调用该方法的下一条指令的地址 异常退出:方法内部发生异常但此异常没有在异常表中,导致异常退出 区别-正常退出与异常退出:异常退出不会给 ...

  8. JVM入门(位置、体系结构、类加载器、双亲委派机制、沙箱安全机制、Native、PC寄存器、方法区、堆(新生区{伊甸园区、幸存区}、养老区、永久区)、OOM、GC算法、JMM)

    目录 一.JVM的位置 二.JVM的体系结构 三.类加载器 1.类加载器举例 2. JVM中提供了三层的ClassLoader 3. 双亲委派机制(重要) 3.1 工作原理 3.2.优点 四.沙箱安全 ...

  9. JVM(类加载、运行时数据区、堆内存、方法区、本地接口、执行引擎和垃圾回收)java虚拟机(JVM)的超详细知识点

    JVM虚拟机 一.JVM的概述 1.为什么要学习JVM 2.虚拟机 3.JVM的作用 作用 特点 4.JVM的位置 5.JVM的分类 6.各个组成部分的用途 7.Java 代码的执行流程 8.JVM ...

最新文章

  1. python初学到底怎么学?大神三天快速学习python的方法留下的笔记
  2. java当前时间转化毫秒_Java中将毫秒转化为日期的方法
  3. 给实例动态增加方法VS给类动态增加方法
  4. 元旦限时特惠,耳机、书籍等大降价
  5. 在ASP.NET MVC5中实现具有服务器端过滤、排序和分页的GridView
  6. 使用FFmpeg类库实现YUV视频序列编码为视频
  7. unity投影和视频画面的调整
  8. Java Promblem/Demand And Solution
  9. WIN7中如何卸载IE8或IE9
  10. 三步必杀(P4231)
  11. 1到100的偶数之和是多少_求1到100之间所有偶数之和
  12. 百度、华为、京东、B站最新面试题汇集,含泪整理面经
  13. 信号间隔是什么意思_摩斯密码字符之间有间隔是什么意思?
  14. python sns画布大小设置
  15. TechEd2011之游园录(1)
  16. msp430g2553串口接受数据_msp430g2553的串口发送程序
  17. 京东数科区块链ABS解决方案受国际权威研究机构认可
  18. 农业计算机应用论文,计算机应用论文农业中计算机应用科技模式
  19. qdbus模块_PyQt 学习笔记4——库结构
  20. 计算机科学转金融工程,计算机如何转金融与金融工程

热门文章

  1. 【记忆化搜索】【dfs】【递归】Chocolate
  2. 9、mysql数据表中数据的查询(1)
  3. SpringBoot maven打包源码发布到仓库配置
  4. 汇编语言(二十)之分类统计字符个数
  5. 十面阿里,菜鸟,天猫,蚂蚁金服题目总汇
  6. spring boot使用注解的方式整合mybaits
  7. 别在被骗了!!!!!!
  8. 什么时候才能都及格呢?
  9. mybatis简单案例源码详细【注释全面】——Utils层(MybatisUtils.java)
  10. com.sun.istack.SAXException2: 在对象图中检测到循环。这将产生无限深的 XML