京东二面被问关于Java类的生命周期,看完这篇,一招怒怼面试官!

【数据结构与算法 11,互联网大厂面试必问的JVM底层原理 int min = arr[minIndex]; for(int j = 1 + i;j<arr.length;j++){ if(min > arr[j]){ min = arr[j]; minIndex = j; } } arr[minIndex] = arr[i]; arr[i] = min; } } 4、速度测试 选择排序:120000数... 阅读详情

在这里插入图片描述

Java类的生命周期

类的生命周期?对象的生命周期?Spring bean 的生命周期?很多同学可能在学习java基础知识之初,很容易把这几个搞混。本文先来说说Java类的生命周期。

知识前提


在了解类的生命周期之前,有必要先了解一下jvm的内存结构。如下所示:

image

在了解完jvm的内存结构之后,我们就知道了例如堆区,栈区,常量池和方法区等概念。

也了解到了,我们编写的代码,是先需要通过编译的,转化成.class文件,才能够被jvm所加载运行的。那简单来说,java类被jvm进行加载到卸载的过程,就是java类的一生,我们称之为java类的生命的周期。

类的生命周期


一个类完整的生命周期,会经历五个阶段,分别为:加载、连接、初始化、使用、和卸载。其中的连接又分为验证、准备和解析三个步骤。如下图所示:

也可能会存在加载或连接之后就直接别使用的情况,这里后续讨论

image

也可以说:Java类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using) 和 卸载(Unloading)七个阶段

加载(Loading)

简单一句话概括,类的加载阶段就是:找到需要加载的类并把类的信息加载到jvm的方法区中,然后在堆区中实例化一个java.lang.Class对象,作为方法区中这个类的信息的入口。结合jvm的内存结构会比较好理解。

这里要区别一下接触到的类加载。类加载其实包括加载、连接、初始化三个阶段。类加载强调一个jvm能够直接使用所需的类,所以类必须完成初始化。

不同的虚拟机对类的加载时机有不同的实现方式,具体要看虚拟机的实现方式。这里不做展开。

类的加载方式比较灵活,总结下来有如下几种:

  1. 据类的全路径名找到相应的class文件,然后从class文件中读取文件内容;(常用)
  2. 从jar文件中读取。另外,还有下面几种方式也比较常用:(常用)
  3. 从网络中获取:比如10年前十分流行的Applet。
  4. 根据一定的规则实时生成,比如设计模式中的动态代理模式,就是根据相应的类自动生成它的代理类。
  5. 从非class文件中获取,其实这与直接从class文件中获取的方式本质

连接(Linking)
  1. 验证:进行类的合法性校验。会对比如字节码格式、变量与方法的合法性、数据类型的有效性、继承与实现的规范性等等进行检查,确保别加载的类能够正常的被jvm所正常运行。

  2. 准备:为类的静态变量分配内存,并设为jvm默认的初值;对于非静态的变量,则不会为它们分配内存。简单说就是分内存、赋初值。

    注意:设置初始值为jvm默认初值,而不是程序设定。规则如下

    • 基本类型(int、long、short、char、byte、boolean、float、double)的默认值为0
    • 引用类型的默认值为null
    • 常量的默认值为我们程序中设定的值,比如我们在程序中定义final static int a = 100,则准备阶段中a的初值就是100。
  3. 解析:这一阶段的任务就是把常量池中的符号引用转换为直接引用。


初始化(Initialization)

类初始化阶段是类加载过程的最后一步。而也是到了该阶段,才真正开始执行类中定义的java程序代码(字节码),之前的动作都由虚拟机主导。

jvm对类的加载时机没有明确规范,但对类的初始化时机有:**只有当类被直接引用的时候,才会触发类的初始化。**类被直接引用的情况有以下几种:

  1. 通过以下几种方式:

    • new关键字创建对象

    • 读取或设置类的静态变量

    • 调用类的静态方法

  2. 通过反射方式执行1里面的三种方式;

  3. 初始化子类的时候,会触发父类的初始化;

  4. 作为程序入口直接运行时(调用main方法);

  5. 接口实现类初始化的时候,会触发直接或间接实现的所有接口的初始化。

关于类的初始化,记住两句话

1、类的初始化,会自上而下运行静态代码块或静态赋值语句,非静态与非赋值的静态语句均不执行。

2、如果存在父类,则父类先进行初始化,是一个典型的递归模型。

区别于对象的初始化,类的初始化所做的一起都是基于类变量或类语句的,也就是说执行的都是共性的抽象信息。而我们知道,类就是对象实例的抽象。


使用(Using)

类的使用分为直接引用和间接引用。

直接引用与间接引用等判别条件,是看对该类的引用是否会引起类的初始化

直接引用已经在类的初始化中的有过阐述,不再赘述。而类的间接引用,主要有下面几种情况:

  1. 当引用了一个类的静态变量,而该静态变量继承自父类的话,不引起初始化
  2. 定义一个类的数组,不会引起该类的初始化;
  3. 当引用一个类的的常量时,不会引起该类的初始化

卸载((Unloading)

当类使用完了之后,类就要进入卸载阶段了。那何为衡量类使用完的标准呢?

  1. 该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
  2. 加载该类的ClassLoader已经被回收。
  3. 该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。

如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生命周期就结束了。


分类: [Java基础]

标签: [java]
在这里插入图片描述

上次挂在了京东(Java岗)二面不服气 流量控制具体怎么控制的?拥塞控制具体的算法怎么样的?Java中的锁有用到哪些?说说syn、re和cas的区别?cas具体怎么现实的?进程和线程的区别?具体讲下什么情况下是多进程,什么情况下是多线程?java中的map有哪些?各个简单介绍下hashmap的底层数据结构是怎么样的?有没有map是按key的值排序的?底层怎么现实的?类的加载流程?具体每一步做了什么?Spring Bean 的作用域。两道算法题1、有序二维数组找target,找到返回坐标,找不到返回[-1, -1];2、树的根节点到叶子节点的所有路 阅读详情

相关推荐

上次挂在了京东(Java岗)二面不服气,这次终于拿下offer,皇天不负有心人了也是!

前言 这话要从三个月前说起:当时一名水友告诉我想要跳槽去京东,然后我就本着推波助澜,为粉丝打气的心态(也可能是看热闹不嫌事儿大?)就支持他一定要去,梦想一定要有,没准儿就实现了呢? 没想到。。。。。。。直接凉凉! 以下为第一次京东二面凉经 京东一面凉经 object的方法,7大方法 synchronized方法讲解 synchronized方法实现原理 volatile关键字的原理 锁的分类 偏向锁讲解 NoClassDefFoundError和ClassNotFound.

JavaJIAMIN的博客 748

阿里社招java面经,JVM类生命周期概述,2024网易Java高级面试题及答案

Java面试核心知识点一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!Java面试核心知识点一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

2401_84007049的博客 712

被裁员逼我去面了一次京东Java研发岗,没想到拿到offer了!社招面试(面试经历+真题总结+经验分享)

这篇文章主要介绍我朋友被裁员,被逼无奈下去面了一次京东Java研发岗,没想到拿到offer了的相关资料,我在这整理了一下他本次面试的经历、真题等等,现在分享给大家。 背景 •面试经历 •京东面试真题 •面试经验分享 这里把重要的知识点都写出来了,不管是核心知识点也好还是面试题也好,让大家对知识框架有个基本轮廓 同时也整理了283页的PDF文档,也是Java的核心知识点。 需要的朋友可以,点击这里领取!!!,暗号是:优快云 1.面试经历 2020年无疑是程序员的寒冬,我也是裁员大潮裁下来的一名,(整个业.

a646705816的博客 1万+

二面京东Java岗问的全都总结在这:源码+Redis,通联数据java面试

BeanFactory和ApplicationContext有啥区别?spring有几种配置方式?如何用基于XML配置的方式配置spring?如何用基于Java配置的方式配置spring?Spring学习笔记+xmind思维导图关于redis缓存面试真题:不止业务缓存,分布式系统中还有哪些缓存?如何避免缓存穿透、缓存击穿、缓存雪崩?经典问题:先更新数据库,还是先更新缓存?失效策略:缓存过期都有哪些策略?负载均衡:一致性哈希解决了哪些问题?缓存高可用:缓存如何保证高可用?

m0_61943758的博客 1022

Unity半透明物体景深失效?教你用双材质球方案完美解决(附完整Shader代码)

本文深入剖析了Unity中半透明物体导致景深效果失效的根本原因,即半透明物体默认不写入摄像机深度图。针对此问题,文章详细介绍了稳定高效的“双材质球”解决方案,通过为物体附加一个仅写入深度信息的不可见材质,完美修复景深效果,并提供了完整的Shader代码与实现脚本。

weixin_29010003的博客 383

Python自动化神器:5分钟搞定PSCAD仿真波形图导出到Word(附WPS兼容方案)

本文介绍如何利用Python自动化库快速将PSCAD仿真波形图导出到Word或WPS,大幅提升电力系统仿真工程师的工作效率。通过精准坐标定位、智能排版和批量处理功能,实现仿真报告的自动化生成,同时提供WPS兼容方案,适用于不同办公环境。

sony5的博客 209

京东Java后端二面-八股+场景项目题面经!

2501_91139003的博客 488

Linux虚拟机mysql安装教程(详细步骤)出现了一个错误:依赖检测失败

Linux虚拟机安装mysql的详细步骤(有报错预警哦)

m0_74953387的博客 5259

京东二面凉凉,三个月的闭关之旅,再次投递拿下京东零售意向函

三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。第一个是算法关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本。

2401_84002482的博客 1364

医药行业新零售项目数据分析报告——基于Excel的分析与可视化

不同平台客户支付金额用数字+百分比展示更直观。各大区支付金额分析较为粗浅,后续可加入不同大区人数、配送费等进行细分分析。图表略微单一,可采用组合图,运用两个及以上维度对数据进行分析。数据来源本项目数据来源于某机构的项目案例,以上分析内容均为本人原创,不涉嫌抄袭。原做项目,新平台首发。

2401_84213513的博客 1495

抑制电磁干扰(EMI)的实用电路技术

抑制电磁干扰(EMI)的实用电路技术 qtFK_EMC_EMI 【导读】本系列文章的第 1 部分至第 4 部分详细介绍了开关电源稳压器引起的传导发射和辐射发射,包括噪声产生机制、测量要求、频率范围、适用的测试限值、传播模式和寄生效应。在第 5 部分中,我将基于这一理论基础介绍抑制电磁干扰 (EMI) 的实用电路技术。 一般来说,电路原理图和印刷电路板 (PCB) 对于实现出色的 EMI 性能至关重要。第 3 部分重点强调通过谨慎的元器件选型和 PCB 布局尽量减小“功率回路”寄生电感的重要性。电源转换

学海无涯的专栏 1196

京东二面凉凉,竭尽全力三月,三月之期已到,这次终于拿下offer!

前言 这话要从三个月前说起:当时一名水友告诉我想要跳槽去京东,然后我就本着推波助澜,为粉丝打气的心态(也可能是看热闹不嫌事儿大?)就支持他一定要去,梦想一定要有,没准儿就实现了呢? 没想到。。。。。。。直接凉凉! 以下为第一次京东二面凉经 京东一面凉经 object的方法,7大方法 synchronized方法讲解 synchronized方法实现原理 volatile关键字的原理 锁的分类 偏向锁讲解 NoClassDefFoundError和ClassNotFoundE

yyyy11119的博客 1722

【声呐技术】基于人工智能的拖曳阵声呐声学数据处理系统 SEA公司AI辅助拖曳阵系统

KraitSense是SEA公司开发的紧凑型被动拖曳阵声呐系统,核心传感器为KraitArray细线拖曳阵列。该系统专为小型舰艇、无人水面艇(USV)和无人潜航器(UUV)设计,通过人工智能与机器学习技术实现水下声学数据的自动化采集、处理与分类。系统与Mind Foundry公司开发的软件平台深度集成,形成端到端的智能反潜战(ASW)解决方案。

u012133341的博客 961

java判断字符串有特殊字符,一招彻底弄懂!

前言 在面经之前,我想从个人感受上说两点很重要的场外因素:面试节奏和心理准备!。 作为一名即将求职的程序员,面对一个可能跟近些年非常不同的2021 年,你的就业机会和风口会出现在哪里?在这种新环境下,工作应该选择大厂还是小公司?已有几年工作经验的老兵,又应该如何保持和提升自身竞争力,转被动为主动? 就目前大环境来看,跳槽成功的难度比往年高很多。一个明显的感受:今年的面试,无论一面还是二面,都很考验Java程序员的技术功底。 京东一面凉经 object的方法,7大方法 synchronized方法讲解

m0_56662340的博客 2133

图数据库Neo4j面试内容整理-Neo4j的性能

在执行复杂关系查询时,Neo4j 通过图结构的高效存储和查询机制,能够比传统的关系型数据库提供更快的性能,尤其是在涉及深层关系的查询时。通过合理的配置、优化查询和使用合适的硬件,Neo4j 可以处理大规模的数据集和高并发的查询请求,满足企业级应用的需求。Neo4j 在处理图数据时,通过优化图的存储、查询和遍历等方面,提供了高效的性能,特别适合用于需要处理复杂关系和多层次连接的应用场景,如社交网络、推荐系统、知识图谱等。:Neo4j 会根据查询的结构和数据的分布自动选择最优的查询计划。

不务正业的猿 587

Python爬虫实战:逆向工程与异步处理攻克Pinterest无限滚动瀑布流

我们将从零开始,逐步分析其数据接口,构建一个功能完整的爬虫,并深入探讨反爬虫策略的应对、性能优化以及数据存储等高级主题。: 在实际爬取中,你需要先访问一次Pinterest主页,获取初始的Cookie和CSRF Token,然后再发起API请求。: Python爬虫,Pinterest,无限滚动,瀑布流,异步IO,httpx,逆向工程,API接口,动态内容,反爬虫。你会很快发现一些关键的请求模式。:页面初始加载有限内容,随着用户滚动,新的图片块通过AJAX动态加载,实现“永无止境”的浏览。

2201_76125261的博客 552

上次挂在了京东Java二面不服气, 三月之期已到,这次终于拿下offer!

前言 这话要从三个月前说起:当时一名水友告诉我想要跳槽去京东,然后我就本着推波助澜,为粉丝打气的心态(也可能是看热闹不嫌事儿大?)就支持他一定要去,梦想一定要有,没准儿就实现了呢? 没想到。。。。。。。直接凉凉! 以下为第一次京东二面凉经 ###京东一面凉经 object的方法,7大方法 synchronized方法讲解 synchronized方法实现原理 volatile关键字的原理 锁的分类 偏向锁讲解 NoClassDefFoundError和ClassNotFou

javadada1197的博客 241

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上次挂在了京东(Java 岗)二面不服气,这次终于拿下 offer 努力终于有收获

上述知识点,囊括了目前互联网企业的主流应用技术以及能让你成为“香饽饽”的高级架构知识,每个笔记里面几乎都带有实战内容。很多人担心学了容易忘,这里教你一个方法,那就是重复学习。打个比方,假如你正在学习 spring 注解,突然发现了一个注解@Aspect,不知道干什么用的,你可能会去查看源码或者通过博客学习,花了半小时终于弄懂了,下次又看到@Aspect 了,你有点郁闷了,上次好像在哪哪哪学习,你快速打开网页花了五分钟又学会了。从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。

2401_84048521的博客 860

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上次挂在了京东Java二面不服气,-三月之期已到,这次终于拿下offer!

无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。

2401_84424699的博客 849
上一篇: 关于Maven常用命令与生命周期,字节架构师有话说!
下一篇: 什么?学java这么久了,你对“SpringMVC-JSON“真的了解吗?
Danny_java
博客等级 码龄5年 9粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值