JVM加载机制--个人理解

今天去了一家公司面试,是技术总监面的,本来是去面实习生岗位的,但是问了很多比较深的问题,个人没答上来,回来之后就打算自己看书总结一下。
首先今天被问到的有关于我个人对于JVM的理解,当时比较蒙蔽,因为不会。后边问了我静态类、静态方法、静态变量之间的区别和用法,当时由于一时答不上来,我就自己给扯到静态代码块去了,说了下静态代码块的加载,可是人家总监瞬间又让我解释原理,也不会呀,回来之后发现原来都是jvm加载机制。吃一堑长一智吧,回来抱书啃一会。
虚拟机把描述类的数据从class文件加载内存,并且对数据进行校验、转换解析、初始化之后形成可以被Java虚拟机直接使用的Java类型,大概的就是这几个步骤。
从class文件被加载到虚拟机内存中开始,到卸载出内存为止,类的生命周期包括了加载、校验、准备、解析、初始化、使用、卸载7个阶段。其中校验、准备、解析三个阶段称为连接,在Java中类的加载和连接过程都是在程序运行期间完成的,可以动态扩展的语言特性就是依赖运行期间动态加载、动态连接实现的,这样类加载会增加性能开销,但提高可Java应用程序的灵活性。
加载、校验、准备、初始化、卸载的顺序是固定的,这些过程都是互相交叉混合进行的,通常会在一个阶段的执行过程中调用或者激活另一个阶段,解析则不一定,解析阶段有可能在初始化阶段结束之后开始,这样可以支持Java的动态绑定。
“加载”阶段是类加载机制的一个阶段,虚拟机规范并没有强制约束什么时候开始加载过程的第一个阶段加载阶段,而是交给虚拟机的具体实现自由把握,但是虚拟机规范严格规定只有4种情况必须立即对类进行初始化,相应的加载、验证、准备阶段自然也需要在初始化阶段开始之前执行。加载阶段虚拟机需要完成的事情有:
1、通过一个类的全限定名获取定义这个类的二进制流。可以从jar包、ear包、war包获取,可以从网络获取、也可以运行时生成。可以通过其他文件生成等。虚拟机规范并没有指明二进制流要从一个class文件中获取,准确的说是没有指明从哪里获取入伙获取。
2、将这个字节流代表的静态存储结构转化为方法区的运行时数据结构。虚拟机规范并未规范方法区存储数据的具体数据结构,数据存储格式由虚拟机实现自行定义。
3、在Java堆中生成一个代表这个类的class对象,作为方法区这些数据的访问入口。
https://img-blog.csdn.net/20161012233011846” alt=”这里写图片描述” title=”” />log.csdn.net/20161012232950802)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值