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

各位读者好! 在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:Java虚拟机概述

1.1.1 JVM做什么?

Java虚拟机执行以下操作:

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

1.1.2 JVM内部架构

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

图2: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子系统概述

图3:ClassLoader子系统概述

1.2.1 ClassLoader如何在Java中工作?

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

图4:Java中的类加载机制

图4:Java中的类加载机制

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

1.2.2如何在Java中加载类?

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

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

1.3运行时数据区

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

图5:JVM运行时数据区

图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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql5.6特性_MySQL5.6新版本特性

MySQL已发布新的系列版本5.6.x,如果打算升级的朋友可以尝试,虽然目前没有收到新版本的使用反馈,但凭借MySQL占据市场份额来看,新版本的确值得期待。五大特性:优化器的改进MySQL Optimizer 团队做了大量的工作为了不断的…

java计算整数出现的次数_[剑指offer题解][Java]1到n整数中1出现的次数

前言众所周知,《剑指offer》是一本“好书”。如果你是个算法菜鸡(和我一样),那么最推荐的是先把剑指offer的题目搞明白。对于剑指offer题解这个系列,我的写作思路是,对于看过文章的读者,能够做到…

mysql 更改root密码及 主机_设置更改root密码(远程,本地)、连接mysql、mysql常用命令...

设置更改root密码1、将mysql加入环境变量中[rootcentos7 ~]# grep mysql /etc/profileexport PATH/usr/local/mysql/bin/:$PATH2、直接登录,无密码[rootcentos7 ~]# mysql -uroot3、方式一:设置密码[rootcentos7 ~]# mysqladmin -uroot password 123456W…

从NetBeans运行和调试WildFly Swarm应用程序

使用NetBeans的Java EE开发人员习惯于直接在NetBeans所选择的应用程序服务器中运行和调试其瘦战应用程序。 在开发打包为ber或镂空jars的微服务时,您期望使用相同的轻松方式进行运行和调试。 好消息是您可以。 在本文中,我将逐步演示如何在NetBeans中运行…

hazelcast入门教程_Hazelcast入门

hazelcast入门教程7月,我写了一个博客向Java开发人员介绍erlang,重点介绍了这两种语言之间的一些异同。 erlang虚拟机具有许多令人印象深刻的内置功能,其中之一是它们独立于位置且可以相互通信。 这意味着可以通过编写很少的代码行在VM之间同…

[MEGA DEAL]完整的Java编程训练营(94%折扣)

成为Java Master的10门课程(83.5小时):使用JavaFX的设计UI,利用设计模式,Master Multithreading等 嘿,怪胎, 本周,在我们的JCG Deals商店中 ,我们提供了另一个超值优惠…

java重排序_Java内存模型FAQ(四)重排序意味着什么?

译者:Alex在很多情况下,访问一个程序变量(对象实例字段,类静态字段和数组元素)可能会使用不同的顺序执行,而不是程序语义所指定的顺序执行。编译器能够自由的以优化的名义去改变指令顺序。在特定的环境下,处理器可能会…

JVM体系结构101:了解您的虚拟机

Java虚拟机(JVM)架构和Java字节码101的初学者速成班 Java应用程序无处不在,它们在我们的手机,平板电脑和计算机上。 在许多编程语言中,这意味着要多次编译代码才能使其在不同的OS上运行。 对于作为开发人员的我们来说…

flask对mysql数据库增删改查_Flask学习(三) - Flask-SQLAlchemy对数据库增删改查

Flask-SQLAlchemy对数据库增删改查安装pip install flask-sqlalchemy具体不多说了,主要是对数据库进行简单的增删改查,上代码,看注释app.route(/)def index():#增加article1 Article(titletest1, contentthe first test)db.session.add(arti…

带有Jersey的JAX-RS教程,用于RESTful Web服务

在当今世界,数据扮演着非常重要的角色。 如此众多的应用程序将各种类型的数据用于不同的操作,所以最重要的方面是应用程序之间的通信。 当应用程序可以通信时,它们之间的数据共享变得容易。 就像在亚洲运行的应用程序向在欧洲运行的应用程序…

java swing 打开文件_java swing实现打开Excel文件并进行处理

这里选择Excel文件是业务需要,话不多说1、引入对Excel处理的相关依赖org.apache.poipoi3.16org.apache.poipoi-ooxml3.162、进行swing的相关布局代码:package com.mozarta;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.xssf.usermodel…

java的对象对象映射_Java对象到对象映射器

java的对象对象映射我在该项目上使用了Dozer一段时间。 但是,最近我遇到了一个非常有趣的错误,这促使我环顾四周,并尝试使用其他“对象到对象”映射器。 这是我找到的工具列表: 推土机:推土机是Java Bean到Java Bea…

java parallelstream_关于Java8 parallelStream并发安全的深入讲解

背景Java8的stream接口极大地减少了for循环写法的复杂性,stream提供了map/reduce/collect等一系列聚合接口,还支持并发操作:parallelStream。在爬虫开发过程中,经常会遇到遍历一个很大的集合做重复的操作,这时候如果使…

使用Google Cloud Storage托管您的Maven工件

如果您使用Google Cloud并将Java用于项目,那么Google Cloud Storage是托管团队工件的理想场所。 它很容易设置,而且很便宜。 如果您对它们的功能不特别感兴趣,那么它比设置现有存储库选项(jfrog,nexus,arc…

java+map对象判断空值_java判断map中是否存在指定对象

Map判断是否包含指定的value使用containsValue方法。(推荐:java视频教程)定义containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true示例:/**** Map集合判断是否包含value**/public class MapDemo{public static vo…

excel查重复_毕业季 | 如何降低论文的查重率

毕业季吾日三省吾身实验做完了吗?论文写完了吗?查重能通过吗?学术圈的前辈告诉我们,只有站在巨人的肩膀上才能看得更远。在撰写一篇论文时,为保证质量和可靠性,难免需要引用前人的成果,这也反映…

Java,JavaFX的流畅设计风格进度栏

按照承诺,刚刚发布的Java JavaFX主题JMetro 4.6版为进度栏带来了新样式。 进度栏有两种可能的状态:确定和不确定,新的JMetro版本具有这两种状态。 在本文中,我还将详细介绍一些我在JMetro中遵守的API设计原则。 JMetro API设计原…

安卓最新系统_成纺移动校园(移动办公系统)V3.2.1 安卓最新版

成纺移动校园(移动办公系统)是额一个非常实用的办公工具。您可以使用该软件及时浏览最新的校园信息,同时涵盖许多功能,例如时间表查询,会议安排,校园地图,校车等。有需要的用户欢迎来绿色先锋网下载。 成纺移动校园简介…

pyqt 获取 UI 中组件_你想知道的React组件设计模式这里都有(上)

本文梳理了容器与展示组件、高阶组件、render props这三类React组件设计模式往期回顾:HBaseCon Asia 2019 Track 3 概要回顾随着 React 的发展,各种组件设计模式层出不穷。React 官方文档也有不少相关文章,但是组织稍显凌乱,本文就…

typora导出word指定样式_(二)最简洁的Markdowd编辑器:Typora

(提醒:前面都是介绍和语法,想下载了就能用的直接看最后总结)大家好,半瓶醋同学又来误人子弟了。现在办公文档或者邮件的处理,一般都是用微软的office word或者邮件自带的编辑器。但是用word或者邮件自带编辑…