我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JVM中类型的生命周期是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JVM中类型的生命周期是什么

本篇文章给大家分享的是有关JVM中类型的生命周期是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

下面重点讲述  类型的生命周期。

类型的生命周期涉及到: 类的装载、jvm体系结构、垃圾回收机制。

为什么要讲jvm体系结构? 因为类的装载和垃圾回收机制都和jvm体系结构息息相关。

那么什么是jvm体系结构呢?

JVM中类型的生命周期是什么

当jvm运行起来的时候,它会向系统申请一片内存区(不同的jvm实现可能不同,有些可以使用虚拟内存),将这块内存分出一部分存储许多东西,例如:程序创建的对象,传递给方法的参数,返回值,局部变量等等,我们将这块内存称之为“运行时数据区”,  运行时数据区可以划分成方法区、堆、java栈、pc寄存器、本地方法栈。

看到上面这幅图,和这些解说你可能大概的明白jvm 体系是个啥样子,但是你或许还不了解运行时数据区里面方法区等用来干嘛的。

  • 方法区:当虚拟机装载一个class文件的时候,它会从这个class文件包含的二进制数据中解析类型信息。然这些类型信息放到方法区中。因为方法区是被所有线程共享的,所以必须考虑数据的线程安全。假如两个线程都在试图找lava的类,在lava类还没有被加载的情况下,只应该有一个线程去加载,而另一个线程等待。

  • Pc寄存器:每个新线程产生都将得到自己的pc寄存器以及一个java栈帧。

  • 堆:存放程序运行时产生的所有对象。堆是一个线程共享的内存区,所以我们写多线程程序的时候需要考虑并发。

  • Java栈:java栈由许多栈帧组成的,如图,当一个线程调用java方法时,虚拟机压入一个新的栈帧到java栈中,当方法返回的时候,这个栈帧被从java栈弹出并被抛弃。

  • JVM中类型的生命周期是什么

那么现在你应该可以想象到一些jvm是怎么工作的了,是不是应该接着讲具体工作原理了呢?。但是不急,先了解下类的装载机制。

了解类的装载机制之前先了解jvm里面的类装载器:Bootstrap Loader、ExtClassLoader 、AppClassLoader;

ExtClassLoader (负责装载jre下面的rt.jar,  charsets.jar)和AppClassLoader(负责转载classpath下面的类包)是ClassLoader(抽象类)的子类;

Bootstrap Loader(负责装载jre核心类库)是根装载器是c/c++写的在java里面看不到它。

这三个类装载器存在父子关系, 根装载器是  ExtClassLoader父装载器,ExtClassLoader是AppClassLoader父装载器;

Jvm中类的装载也是安全机制沙箱模型的***道门槛。 Java装载类使用“双亲委派模式”—即全盘负责委托机制。

好现在让我们了解装载大概流程;

当装载一个类的时候,若是由用户指定一个类装载器装载的话,那么那个类装载器会先委派给父类装载器,一直委派到根装载器,如果装载的是一个  java.lang.String,由于它是核心类库的而且已经被装载过了,那么就会直接返回一个class对象,那么如果是一个根装载器找不到的类呢?接着就会交给子类(下一级父类)装载器,如果还是没有找到类文件,接着就会由之前用户指定的那个类装载器装载。(这里没有说明装载超类的过程,请勿疏忽)。

如果是有人恶意的写了一个基础类java.lang.String,那么会影响虚拟机吗?  不会因为这个类最终会交由根装载器装载,而根装载器只会去jre核心类库加载,最终返回的class类型并不是  用户写的String,而且系统自带的String,也就是说用户写String永远不会被加载。

了解了类装载器是怎么工作了之后,我们也需要了解下class文件格式;

The ClassFile Structure ClassFile{ u4 magic;    //魔数 u2 minor_version; //class 次版本号 u2 major_version; //class 主版本号  u2 constant_pool_count;  //常量池计数 cp_info constant_pool[constant_pool_count-1];  //常量池 u2 access_flags;   //修饰符 u2 this_class;  /常量池索引 u2 interfaces_count;   u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count]; u2 methods_count; method_info methods[methods_count]; u2 attributes_count; attribute_info attributes[attrributes_count]; }

我们需要了解的有很多,但是我们难以理解的就是 cp_info constant_pool 常量池;

一个常量池里面有很多表

  • CONSTANT_Utf8 UTF-8编码的Unicode字符串

  • CONSTANT_Integer int类型的字面值

  • CONSTANT_Float float类型的字面值

  • CONSTANT_Long long类型的字面值

  • CONSTANT_Double double类型的字面值

  • CONSTANT_Class 对一个类或接口的符号引用

  • CONSTANT_String String类型字面值的引用

  • CONSTANT_Fieldref 对一个字段的符号引用

  • CONSTANT_Methodref 对一个类中方法的符号引用

  • CONSTANT_InterfaceMethodref 对一个接口中方法的符号引用

  • CONSTANT_NameAndType 对一个字段或方法的部分符号引用

这些表结构我也不解释了

如果对class文件不够了解也没什么关系,知道个大概也行。那么我们了解了 jvm体系,类装载器工作流程,那么我们细看下 类装载器工作中  ,jvm运行时数据区的变化,方法区里面的结构等等。

在类装载的过程中,  每一个类装载器都会在方法区里面形成一张表,这张表记载着该装载器和对应的类的权限定名。没这么一张表就形成了jvm内部的命名空间。同时在方法区里面还该类的常量池等信息。

那么说到这些,其实这个过程还是很模糊,而且很多知识也落下了,那么我们现在看一个详细一点的装载过程。

当装载一个普通的类的时候,即调用类装载器的loadClass方法,  如果希望装载的类还没有被装载到命名空间,那么jvm会传递一个该类型的全限定名给类装载器,也就是常量池CONSTANT_Class_info(该表存储着父类、类装载器等信息)入口的装载器,来试图装载被引用的类型,如果发起引用的类型是被jvm装载器定义的,那么由jvm类装载器装载,否则由用户自定义装载器装载,那么一旦被引用的类型被装载了,jvm仔细检查它的二进制数据,如果类是是一个类,并且不是java.lang.Object。  jvm根据数据得到它的全限定名进行装载(递归的应用了)这个过程还需要递归超接口。

装载差不多讲完了,一个完整的过程 是: 装载—连接---初始化

那么连接和初始化就一带而过了, 重点放在垃圾回收。

连接的过程主要是验证(确认类型符合java语言的语义,并且它不会危及虚拟机的完整性)、准备(java  虚拟机为类变量分配内存,设计默认初始值)、解析(在类型的常量池中寻找类、接口、字段和方法的符合引用,把这些符号引用替换成直接引用的过程)。

初始化的时候,如果类存在直接超类,且超类还没有被初始化,就先初始化直接超类。初始化接口并不需要初始化它的父接口。

补充:

Jvm当运行某个方法的时候,先把这个方法压入java栈中,里面包含局部变量等信息,那么对象放入哪里呢? 压入栈的是对象的引用, 即变量,  所有的对象都存储在堆中。

为什么要把对象放入堆,把变量之类的数据放入栈呢? 说白了,对象太大了,存入栈中运算麻烦。(当然标准的回答不是这样的,我这里仅仅是说明实质)

了解了这么一个过程之后,我们必然要了解垃圾回收机制了。

基本回收算法

  1. 引用计数:比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。

  2. 标记-清除:此算法执行分两阶段。***阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。

  3. 复制:此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。次算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不过出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。

  4. 标记-整理:此算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段,***阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。

  5. 增量收集:实施垃圾回收算法,即:在应用进行的同时进行垃圾回收。

  6. 分代:基于对对象生命周期分析后得出的垃圾回收算法。把对象分为年青代、年老代、持久代,对不同生命周期的对象使用不同的算法(上述方式中的一个)进行回收。现在的垃圾回收器(从J2SE1.2开始)都是使用此算法的。

以上就是JVM中类型的生命周期是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JVM中类型的生命周期是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JVM中类型的生命周期是什么

本篇文章给大家分享的是有关JVM中类型的生命周期是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。下面重点讲述 类型的生命周期。类型的生命周期涉及到: 类的装载、jvm体系
2023-06-17

vue中的生命周期是什么

这篇文章给大家分享的是有关vue中的生命周期是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、什么是生命周期每一个组件都可能经历从创建,挂载,更新,卸载的过程。在这个过程中的某一个阶段,用于可能会想要添加一
2023-06-29

Flutter的生命周期是什么

今天小编给大家分享一下Flutter的生命周期是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一 这里看一下Statef
2023-07-06

Springbean的生命周期是什么

Spring Bean的生命周期可以分为以下几个阶段:实例化(Instantiation):在容器启动时,Spring根据配置信息或注解实例化Bean对象。属性赋值(Population of properties):Spring将通过依赖
2023-10-24

Vue的生命周期是什么

本篇内容主要讲解“Vue的生命周期是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue的生命周期是什么”吧!生命周期生命周期的简单介绍1.生命周期又叫做:生命周期回调函数、生命周期函数、生
2023-06-29

spring中bean的生命周期是什么

在Spring中,Bean的生命周期包括以下几个阶段:1. 实例化:当Spring容器接收到请求时,根据配置文件或注解等方式,在内存中创建Bean的实例。2. 属性赋值:Spring容器通过依赖注入的方式,将Bean的属性值注入到相应的属性
2023-09-27

PHP7中生命周期指的是什么

这篇文章给大家分享的是有关PHP7中生命周期指的是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。PHP架构SAPI 介绍定义:Server Application Programming Interface服
2023-06-15

thinkphp生命周期是什么

ThinkPHP是一个基于PHP的开源框架,其生命周期指的是在一个请求到达服务器到返回响应的整个过程中,ThinkPHP框架在不同的阶段执行的一系列操作和事件。ThinkPHP的生命周期包括以下几个阶段:1. 路由解析阶段:在这个阶段,框架
2023-08-24

laravel生命周期是什么

Laravel的生命周期是指在处理一个HTTP请求时,从请求进入Laravel应用程序开始,到返回响应结束的整个过程。下面是Laravel的请求生命周期的主要阶段:1. 启动阶段:Laravel应用程序被启动,加载配置文件、注册服务提供者等
2023-09-21

微信APP生命周期及页面生命周期是什么

本篇内容介绍了“微信APP生命周期及页面生命周期是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!小程序的启动流程我们画一个图来表示一下,
2023-06-30

android thread的生命周期是什么

Android中的线程有以下几个生命周期:1. 新建状态(New):线程对象已经创建,但还没有调用start()方法。2. 就绪状态(Runnable):调用了线程对象的start()方法后,线程进入就绪状态,等待系统调度执行。此时线程并没
2023-10-07

Spring Bean的生命周期是什么

这篇“Spring Bean的生命周期是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring Bean的生命周期是
2023-07-05

Java中线程的生命周期是什么

这篇文章主要介绍“ Java中线程的生命周期是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ Java中线程的生命周期是什么”文章能帮助大家解决问题。操作系统中线程的生命周期操作系统的线程生命周
2023-06-16

Spring bean的生命周期是什么

Spring bean的生命周期包括以下阶段:1. 实例化(Instantiation):在容器启动时,Spring根据配置信息或注解等方式实例化bean对象。2. 属性赋值(Populate bean properties):Spring
2023-08-24

java servlet生命周期是什么

Java Servlet的生命周期指的是一个Servlet从被创建到被销毁的整个过程。下面是Java Servlet的生命周期的几个关键阶段:1. 加载和实例化:当服务器启动时,会根据web.xml文件中的配置信息加载和实例化Servlet
2023-09-20

Vue中生命周期函数是什么

这篇文章主要为大家展示了“Vue中生命周期函数是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue中生命周期函数是什么”这篇文章吧。生命周期函数生命周期函数又叫:生命周期回调函数,生命周期
2023-06-25

vue生命周期的作用是什么

这篇文章主要介绍了vue生命周期的作用是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue生命周期的作用是什么文章都会有所收获,下面我们一起来看看吧。Vue.js 的生命周期方法在 Vue.js 组件中,
2023-07-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录