Java基础—JAVA类的生命周期问题

1.JDK与JRE的作用

当我们编写Java程序时,我们实际上是在使用一种高级编程语言,而计算机最终需要将这些高级语言转换成机器语言才能执行。在这个过程中,Java开发工具包(JDK)和Java运行时环境(JRE)扮演了重要角色:

  • JDK:JDK是一个完整的JAVA开发工具包,它包含了编译器(JAVA Compiler即javac)、库和开发工具。JDK的编译器作用就是把.java文件变成.class文件的过程,即把高级语言转化成编译语言(字节码)。
  • JRE:JRE是JAVA运行时环境,它包含了JAVA虚拟机(JVM)、JAVA核心类库和支持文件。其中重点就是JVM,JVM中包含了JVM解释器,它的作用是将Java程序编译后的字节码文件(.class文件)解释成机器语言,从而让计算机能够执行Java程序。

这一过程也就是为什么JAVA常被称为“半编译、半解释语言”(主编译)。
为什么说JAVA的生命周期要说到JDK和JRE,我是觉得了解Java程序从编写到运行再到结束的整个生命周期过程,不仅涉及到JDK和JRE的角色,还需要理解JAVA程序再不同阶段的处理和运行方式。
这种全面的了解可以帮助我们更好地理解Java地设计概念和底层结构,以及Java程序再运行时的行为和性能表现。

在上面的内容我们也可以得知,在字节码加载到内存前,其实还有一个编译过程就是 .java->.class,从这一步后,就是整个JAVA类生命周期的开始。

2. JAVA类的生命周期

  1. 加载(Loading):ClassLoader将字节码文件加载到内存中,并创建一个代表该类的Class文件。
  2. 链接(Linking)
    • 验证(Verification):确保加载的类符合JVM规范,不会导致安全问题
    • 准备(Preparation):为类的静态变量分配内存,并设置默认初始值。
    • 解析(Resolution):将类、方法字段等符号引用解析为直接引用
  3. 初始化(Initialization):执行类的初始化代码,包括静态变量赋值和静态初始化块的执行。
  4. 运行(Running):实例化类并调用其方法,执行程序逻辑
  5. 卸载(Unloading):当类不再需要时,ClassLoader可以卸载类,并释放相关资源。

在这里插入图片描述

3.生命周期(类加载)—加载(Loading)

ClassLoader负责加载字节码文件(.class文件)到内存中。ClassLoader有三种:Bootstrap ClassLoader(启动类加载器)、Extension ClassLoader(扩展类加载器)和Application ClassLoader(应用程序类加载器)。它们会按照一定的顺序来尝试加载类文件,最终加载的类文件会被转换成二进制形式并存储在内存中。

一旦类文件被加载到内存中,JVM会为这些类创建对应的‘class’对象。这个对象包含了类的结构信息,比如类的方法、字段、构造函数等。‘Class’对象会被创建并存储在方法区,这个对象在整个类的生命周期都存在,直到程序结束才会被销毁。

在JAVA虚拟机(JVM)中,‘Class’对象通常都是存在方法区(Method Area)中的。方法区是一块用于存储类信息、常量、静态变量等数据的内存区域,它是线程共享的内存区域,在JVM启动时被创建。方法区属于堆内存的一部分,但是它有一些特殊行为,例如不会进行垃圾回收。
类的元数据信息和类的对象实例的存储空间是不同的,类元数据信息在方法区,实例对象是在堆内存中。

4.生命周期(类加载)—链接(Linking)

连接分为三个阶段:验证->准备->解析

  • 验证:确保加载的类符合JVM规范,不会导致安全问题。这个不过多解释,正常开发应该不会坑在这里。
  • 准备:为类的静态变量分配内存并设置初始值
    1. 为类静态变量分配内存空间。这时候静态变量会被分配到方法区中的静态变量区域。
    2. 设置静态变量的默认初始值。根据静态变量的类型赋予默认值。 例如,int 类型的默认值为 0,boolean 类型的默认值为 false,引用类型的默认值为 null。
      注意:准备阶段并不会真正为静态变量赋予程序中的指定值,而只是为它们分配内存并设置默认初始值。
  • 解析:在这个阶段,虚拟机将常量池中的符号引用替代为直接引用。
  1. 将类、方法、字段的符号引用转换为直接引用:在编译阶段,Java编译器生成的class文件会包含许多符号引用,比如类名、方法名、字段名等。在解析阶段,虚拟机会将这些符号引用替代为直接引用,指向内存中的实际数据结构,比如指向方法区中的方法表、字段表等。

符号引用:以一组符号描述所引用的目标。在编译时,因为类还没加载到方法区,java类并不知道引用的对象的实际地址,因此只能使用符号引用替代。比如com.Test类类引用了com.MyMO类,编译时Test类并不知道MyMo类的实际内存地址,因此只能使用符号com.MyMo
直接引用:通过对符号引用进行解析,找到引用的实际地址。

  1. 在Java虚拟机中,解析过程可以延迟到进行时进行,这种延迟解析方式可以提高程序性能。
    例子:延迟解析的一个例子是动态链接。在动态链接的情况下,方法的符号引用会被解析为实际的内存地址,但是这个解析过程可以延迟到方法被调用时进行,而不是在类加载阶段就完成。这样可以避免在类加载时就解析所有的方法引用,提高了程序的性能。

5. 生命周期(类加载)—初始化(Initialization)

在Java中,类的初始化阶段是类加载过程的最后一个阶段,在这个阶段,JVM会执行类的初始化代码,包括静态变量赋值和静态初始化块的执行。

  1. 静态变量赋值:在准备阶段,静态变量被分配了内存并设置了默认值,而在初始化阶段,会执行静态变量的赋值操作,将静态变量设置为程序中指定的值。
  2. 静态初始化块的执行:类中的静态初始化块会在初始化阶段被执行。静态初始化块可以包含任意的java代码,用于完成一些静态资源的初始化工作。
  3. 可执行静态方法: 只有在静态方法被显式调用或者静态方法在静态初始化块中被调用时,才会执行这些静态方法

至此,类的加载完毕,一共经历四个阶段,规范检查(检查)->类元数据加载并赋值默认值(准备)->符号引用变为直接引用(解析)->静态变量赋值、静态代码块执行(初始化)

6.运行(Running)与卸载(Unloading)

  • 运行:在这个阶段,逻辑执行,类的实例被创建,并且可以通过调用实例方法执行程序功能
  • 卸载:类的卸载也是由ClassLoad进行管理的,通常在类加载器被垃圾回收时才会触发。正常不会触发
    在正常情况下,Java程序运行过程中很少会发生类的卸载。这是因为在Java虚拟机中,类的卸载通常需要满足下面条件:
    1. 类实例的引用数量为零:即没有任何类的实例被引用,包括静态变量对该类的引用。
    2. 类的ClassLoader被卸载:ClassLoader负责加载类到内存中,当ClassLoader被卸载时,它加载的类也会被卸载。
    3. 没有被其他类引用:即没有其他类通过反射等方式引用该类。
      在正常情况下,这些条件很难同时满足,所以类的卸载在正常程序运行时并不常见。但是,在某些特殊情况下,比如使用自定义的ClassLoader动态加载类时,可能会出现类的卸载。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity资源热更新----AssetBundle

13.1 资源热更新——AssetBundle1-1_哔哩哔哩_bilibili Resources 性能消耗较大 Resources文件夹大小不能超过2个G 获取AssetBundle中的资源 打包流程 选择图片后点击 创建文件夹,Editor优先编译 打包文件夹位置 using UnityEditor; using UnityEngine; public cla…

linux_aarch64_qt环境搭建

平台环境: ubuntu 16.04: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) aarch64 gnu gcc版本: gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz Qt交叉编译版本: qt-everywhere-src-5.12.9.tar.xz 一、aarch64编…

Elastic Agent 的安装及使用

概述 Elastic Agent是Elastic Stack中的一个全新组件,旨在简化和统一监控和集成管理流程。它是一个轻量级的代理,可以部署到各种不同类型的主机和容器中,用于收集系统指标、日志和事件数据,并将其发送到Elasticsearch进行存储和分析。 在es7及以前的版本中,使用 elast…

阿里云和腾讯云2核4G服务器租用价格对比,选哪个好?

租用2核4G服务器费用多少?2核4G云服务器多少钱一年?1个月费用多少?阿里云2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年;腾讯云轻量2核4G服务器5M带宽165元一年、252元15个月、540元三…

算法打卡day14|二叉树篇03|Leetcode 104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

算法题 Leetcode 104.二叉树的最大深度 题目链接:104.二叉树的最大深度 大佬视频讲解:二叉树的最大深度视频讲解 个人思路 可以使用层序遍历,因为层序遍历会有一个层数的计算,最后计算到的层数就是最大深度; 解法 迭代法 就是…

AJAX 02 案例、Bootstrap框架

AJAX 学习 AJAX 2 综合案例黑马 API01 图书管理Bootstrap 官网Bootstrap 弹框图书管理-渲染列表图书管理-添加图书图书管理-删除图书图书管理 - 编辑图书 02 图片上传03 更换图片04 个人信息设置信息渲染头像修改补充知识点:label扩大表单的范围 AJAX 2 综合案例 黑…

图片制作二维码能批量生成吗?快捷在线制作二维码的技巧

现在很多场景下获取内容的方式都会通过扫描二维码来获取,比如常见的有文本内容、图片照片、音频视频等。二维码制作的方法也越来越简单,只需要通过二维码生成器的功能就可以快速完成,那么如果需要将多张图片每一张单独生成二维码使用时&#…

学习笔记--强化学习(1)

参考:https://blog.csdn.net/koulongxin123/article/details/122676149 1.什么是强化学习? (1)定义 基于环境的反馈而行动,通过不断与环境的交互、试错,最终完成特定目的或者使得整体行动收益最大化(是一种通过与环境…

如何评估产品说明书的质量和有效性

评估产品说明书的有效性和质量涉及多个关键方面,这些方面共同决定了说明书是否能够满足用户的需求,提供准确、清晰且有价值的信息。以下是一些建议的评估步骤和标准: 1、完整性检查: 确保产品说明书涵盖了产品的所有关键功能和特…

ai怎么制作ppt?保姆级的ai一键生成ppt教程来了!

面对市面上多如牛毛的 ai 生成 ppt 软件,哪一款更适合日常使用呢?与此同时,在选定一款 ai 软件后,如何用 ai 制作 ppt,也是很多人第一次使用 pptai 工具会面临的具体问题。 就着这些问题,在接下来的文章中…

【分类讨论】【解析几何】【 数学】【推荐】1330. 翻转子数组得到最大的数组值

作者推荐 视频算法专题 本文涉及知识点 分类讨论 解析几何 LeetCode1330. 翻转子数组得到最大的数组值 给你一个整数数组 nums 。「数组值」定义为所有满足 0 < i < nums.length-1 的 |nums[i]-nums[i1]| 的和。 你可以选择给定数组的任意子数组&#xff0c;并将该子…

Mac电脑搭建前端项目环境,并适配老项目

1.上一篇文章中&#xff0c;我说到了&#xff0c;node.js中文网下载node 包&#xff0c;根据系统进行选择&#xff0c;然后安装包node即可&#xff0c;对于比较新的项目确实也是适用的&#xff0c;但是老项目就不行了会报错&#xff0c;node版本过高&#xff0c;导致环境不匹配…

全栈的自我修养 ———— python使用绘制工具turtle

实现基础turtle入门 一、下载二、基础知识三、实现效果1、圆2、五3、蛇5、循环的正方形 一、下载 turtle是python中模块中自带的一般不需要下载如果报错如下&#xff0c;需要下载自己下载python-tk模块,详细请看python-tk下载 (mac的话可以直接用brew install python-tk) (my…

Kubernetes operator系列:webhook 知识学习

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列文章&#xff0c;本节会对 kubernetes webhook 知识进行学习 本文的所有代码&#xff0c;都存储于github代码库&#xff1a;https://github.com/graham924/share-code-operator-st…

Pixelmator Pro:专业级图像编辑,触手可及mac版

Pixelmator Pro是一款功能强大的图像编辑软件&#xff0c;专为Mac操作系统设计。它拥有直观的界面和丰富的工具&#xff0c;能够满足用户各种图像处理需求。 Pixelmator Pro软件获取 首先&#xff0c;Pixelmator Pro支持多种文件格式&#xff0c;包括JPEG、PNG、GIF、BMP、TIF…

1.Python数据分析—数据分析与挖掘详讲

1.Python数据分析—数据分析与挖掘详讲 一个人简介二数据分析与挖掘概述三什么是数据分析和挖掘四数据分析与挖掘在不同领域的应用4.1医疗领域&#xff1a;4.1.1 建立疾病数据库&#xff1a;4.1.2 临床决策支持&#xff1a;4.1.3 疾病预警和监控&#xff1a; 4.2 电子商务领域&…

将Linux curl命令转换为windows平台的Python代码

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

unity3d Animal Controller的Animal组件中Stances,Advanced基础部分理解

Stances 立场 立场要求在动物动画控制器上的姿态动画参数。 你可以有多个运动状态,并根据当前的立场使用它们 过渡的条件是: Stance StanceID Default Stance默认姿势 如果调用函数Stance_Reset&#xff08;&#xff09;&#xff0c;动物将返回到的默认姿势。 Current …

SpringBoot扩展篇:Spring注入 @Autowired @Resource

Spring注入 Autowired & Resource 1. 概述1.1 职责1.2 流程概述 2. Demo3. AutowiredAnnotationBeanPostProcessor注册4. 注册元数据4.1 AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition4.2 AutowiredAnnotationBeanPostProcessor#findAutowiringMe…

Android 仿天通卫星对准(卫星在圆形卫星轨道上转动)效果实现

效果图 View源码 package com.android.circlescalebar.view;import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics…
最新文章