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,一经查实,立即删除!

相关文章

mysql flush cache_mysql的SQL_NO_CACHE(在查询时不使用缓存)和sql_cache用法

转自:http://www.169it.com/article/5994930453423417575.html为了测试sql语句的效率,有时候要不用缓存来查询。使用SELECT SQL_NO_CACHE ...语法即可SQL_NO_CACHE的真正作用是禁止缓存查询结果,但并不意味着cache不作为结果返回给query。目前…

-%3erow mysql_MySQL查询优化

# MySQL查询优化* [请简述项目中优化MySQL语句执行效率的方法,从哪些方面入手,SQL语句性能如何分析?](https://www.kancloud.cn/ranjun940726/php_interview/596348#MySQLSQL_3)* [分析查询速度](https://www.kancloud.cn/ranjun940726/php_i…

apache karaf_Apache Karaf遇到Apache HBase

apache karaf介绍 Apache HBase是一个以Google Bigtable为蓝本的开源,分布式,版本化,面向列的商店。 如果您是普通读者,那么您可能已经知道Apache Karaf是什么,但是对于那些不是的读者:Apache Karaf是一个O…

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

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

实现threadlocal_ThreadLocal如何实现?

实现threadlocal这是我上周的帖子的后续文章,其中我解释了ThreadLocal用法背后的动机 。 从帖子中我们可以回忆起,如果您希望为每个线程拥有一个独立初始化的变量副本,则ThreadLocal确实是一个很酷的概念。 现在,好奇的人可能已经…

mysql timeout的单位_mysql的timeout-阿里云开发者社区

mysql的timeout很多时候我们连接mysql会在timeout这里跌倒,这里明确下mysql的timeout:下面是获取timeout的变量:mysql> show global variables like "%timeout%";---------------------------------------| Variable_name | Val…

带有Spring Boot 2.0的Spring Security:UserDetailsS​​ervice

正如我们在上一篇文章中所看到的,我们的spring应用程序的用户名和密码是通过环境变量配置的。 这对于原型目的是可以的,但是在现实生活中,我们必须提供另一种方式来使用户有资格登录到该应用程序。 为此,我们使用UserDetailsS​​…

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

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

mysql数据库+ssh框架_SSH框架+Mysql数据库开发java web会员积分消费管理系统

项目描述会员消费管理:会员信息调取查询、会员消费商品添加金额计算、兑换商品等会员管理:会员增删改查积分管理:积分设置、商品积分设置等积分兑换、数据库备份还原、折扣管理、商品管理等运行环境jdk7(8)tomcat7(8)mysql5.7myeclipes或ecli…

spring和spring_Spring交易可见性

spring和spring在初始化应用程序上下文时,Spring在遇到带有Transactional标记的类时会创建代理。 Transactional可以应用于类级别或方法级别。 在类级别应用它意味着该类中定义的所有公共方法都是事务性的。 Spring创建的代理类型,即Jdk代理或CGLIB代理&…

python上传文件到linux服务器_python上传大文件到服务器报错

项目需要,在mac上将打包好的文件(四五百兆)自动上传到web后台,用了两种方式上传,都报了类似的错误,在windows和linux上测试不会报错,但是到了mac打包机上就会报错:①第一种报错:Traceback (most…

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中运行…

mysql 事实表 维度表_数据库的事实表与维度表

维度表示你要对数据进行分析时所用的一个量,比如你要分析产品销售情况,你可以选择按类别来进行分析,或按区域来分析,这样的按照什么分析就构成一个维度。前面的实例就可以有两个维度:类型和区域。另外每个维度还可以有…

hazelcast入门教程_Hazelcast入门

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

tcp java实例_实现了基于TCP的Java Socket编程实例代码

实现了基于TCP的Java Socket编程,功能很简单:客户端向服务器端输出一名话"connect",服务器端接收输出到控制台并向客户端输出一名话"Hello",客户端接收并输出。1.服务器端package javase.net.socket;import java.io.Data…

java 批量上传图片插件_java多文件上传plupload控件实现多图片上传(一)

使用的是plupload-2.1.2 控件。网上资源挺多的,很好下载。plupload 官方地址 : http://www.plupload.com/plupload 示例: http://www.plupload.com/examples/plupload Github: https://github.com/moxiecode/plupload整体框架用的是easyui springMVC。1、前台jsp页…

java servlet_Java Servlet的前100个问题

java servlet1)是“ servlets”目录还是“ servlet”目录? 回答: 对于Java Web Server: 在文件系统上,它是“ servlet” c:\ JavaWebServer1.1 \ servlets \ DateServlet.class 在URL路径中,…

精通java ee项目案例_精通JavaEE项目案例

第1章 Java EE开发入门 11.1 基本概念 11.1.1 Java EE API 11.1.2 MVC模型 21.1.3 JSP讨论 31.1.4 Servlet讨论 41.1.5 Model1和Model2 51.2 Eclipse 51.2.1 Eclipse的平台简介 61.2.2 Eclipse的体系结构 61.3 Struts 71.3.1 认识Struts 71.3.2 Strut…

java调用php session_php读取memcahed java session

情景:1:现在有两个系统,一个是Java做的系统,一个是PHP的系统,现在要把两个系统弄成一个单点登录。2:两个系统两个库,两个库的表结构完全不同,现在要解决的就是session共享问题和用户…