虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换分析和初始化,最终形成可以被虚拟节直接使用的JAVA类型,这就是虚拟机的类加载机制。

类从被加载到虚拟机内存到卸载出内存的生命周期包括:加载->连接(验证->准备->解析)->初始化->使用->卸载

初始化的5种情况:

1.使用new关键字实例化对象时,读取或设置一个类的静态字段,除被final修饰经编译结果放在常量池的静态字段,调用类的静态方法时。 2.使用java.lang.reflect包方法对类进行反射调用时。(Class.forName())。 3.初始化子类时,如果父类没有初始化。 4.虚拟机启动时main方法所在的类。 5.当使用JDK1.7动态语言支持时,java.lang.invoke.MethodHandle实例解析结果为REF_getStatic,REF_putStatic,REF_invokeStatic的方法句柄,且对应类没有进行初始化。

加载 加载是类加载的第一个阶段,虚拟机要完成以下三个过程:

1.通过类的全限定名获取定义此类的二进制字节流。 2.将字节流的存储结构转化为方法区的运行时结构。 3.在内存中生成一个代表该类的Class对象,作为方法区各种数据的访问入口。

验证 目的是确保class文件字节流信息符合虚拟机的要求。

准备 为static修饰的变量赋初值,例如int型默认为0,boolean默认为false。

解析 虚拟机将常量池内的符号引用替换成直接引用。

初始化 初始化是类加载的最后一个阶段,将执行类构造器< init>()方法,注意这里的方法不是构造方法。该方法将会显式调用父类构造器,接下来按照java语句顺序为类变量和静态语句块赋值。

方法调用

Java是一门面向对象的语言,它具有多态性。那么虚拟机又是如何知道运行时该调用哪一个方法?

静态分派是在编译期就决定了该调用哪一个方法而不是由虚拟机来确定,方法重载就是典型的静态分派。 动态分派是在虚拟机运行阶段才能决定调用哪一个方法,方法重写就是典型的动态分派。

动态分派的实现:当调用一个对象的方法时,会将该对象的引用压栈到操作数栈,然后字节码指令invokevirtual会去寻找该引用实际类型。如果在实际类型中找对应的方法,且访问权限足够,则直接返回该方法引用,否则会依照继承关系对父类进行查找。实际上,如果子类没有重写父类方法,则子类方法的引用会直接指向父类方法。

由Java虚拟机自带的类加载器所加载的类,在虚拟机的生命周期中,始终不会被卸载。

前面介绍过,Java虚拟机自带的类加载器包括根类加载器、扩展类加载器和系统类加载器。

Java虚拟机本身会始终引用这些类加载器,而这些类加载器则会始终引用它们所加载的类的Class对象,因此这些Class对象始终是可触及的。

由用户自定义的类加载器加载的类是可以被卸载的。

具体的例子为:

loader1变量和obj变量间接应用代表Sample类的Class对象,而objClass变量则直接引用它。

如果程序运行过程中,将上图左侧三个引用变量都置为null,此时Sample对象结束生命周期,MyClassLoader对象结束生命周期,代表Sample类的Class对象也结束生命周期,Sample类在方法区内的二进制数据被卸载。

当再次有需要时,会检查Sample类的Class对象是否存在,如果存在会直接使用,不再重新加载;如果不存在Sample类会被重新加载,在Java虚拟机的堆区会生成一个新的代表Sample类的Class实例(可以通过哈希码查看是否是同一个实例)。

java 字节码加载_java面试题jvm字节码的加载与卸载相关推荐

  1. java 字节码详解_Java基础篇(JVM)——字节码详解

    这是Java基础篇(JVM)的第一篇文章,本来想先说说Java类加载机制的,后来想想,JVM的作用是加载编译器编译好的字节码,并解释成机器码,那么首先应该了解字节码,然后再谈加载字节码的类加载机制似乎 ...

  2. java 必须存在默认构造器_Java默认构造方法在字节码的实现

    方法在程序的重要性不言而喻,了解方法在字节码中的表达能够使我们开发做到更加心中有数. 再看class文件结构 上一步已经分析完了class文件中的字段(field_info)的表达,接下来就是方法数( ...

  3. java判断题及答案_Java面试题及解析(判断题)

    1.代码差错,判断代码对错,并指出错误处 abstract class Name{ private String name; public abstract Boolean isStupidName( ...

  4. 下面选项中不是开发java程序的步骤是_Java基础试题及其答案2

    Java试题 1) java程序中,main方法的格式正确的是().(选择一项) a)static void main(String[] args) b)public void main(String ...

  5. java输出到txt 换行_Java输出到txt文件时如何加换行符

    Java输出到txt文件时如何加换行符 时间:2017-09-18     来源:华清远见JAVA学院 知道Java输出到txt文件时如何加换行符吗?今天华清Java学院小编就和大家分享三种Java输 ...

  6. java基础选择判断题_java基础试题3(选择) | 学步园

    第四组: 1.要从文件"file.dat"中读出第10个字节到变量c中,下列哪个方法适合?() A.FileInputStream in=new FileInputStream(& ...

  7. java ioc是什么意思_Java技术面试题解析:举例说明什么是IoC

    原标题:Java技术面试题解析:举例说明什么是IoC IoC是什么呢?有些人可能会有疑问? IoC便是Inversion of Control,操控回转.在Java开发中,IoC意味着将你规划好的类交 ...

  8. java 面试什么是类_Java 面试题代码类收集

    long temp=(int)3.9; System.out.println(temp); temp%=2; System.out.println(temp); 3 1 View Code Java里 ...

  9. java输出到txt 换行_java输出到TXT文件时肿么加换行?

    java输出到txt的时候增加换行符的方法如下: package com.anjoyo.test; import java.io.FileWriter; import java.io.IOExcept ...

最新文章

  1. prefetch 和preload_前端preload, prefetch,dns-prefetch,defer,async了解一下
  2. Gatling教程系列一简单GET请求测试(二)
  3. 如何用c#打开文件夹并选择文件夹内的一个文件 open folder and select file
  4. C# WPF中用ChartControl绘制柱形图
  5. C# winform 如何让TextBox文本内容垂直居中?
  6. 新版码支付个人免签支付系统源码+实测成功
  7. 常见电容器图片_电容的电路符号及图片识别
  8. 计算机专业知识更新速度快,最近及计算机专业知识.doc
  9. 优化食物与食物营养结构相宜表(中国家庭健康工程推荐)
  10. 疫情推动“宅经济”成为当前重要经济发展模式
  11. tx2 can通信之开机自动加载can模块
  12. GT sport真实赛道详解 - Brands Hatch | 伯蘭士赫治GP賽車場
  13. python起源,概念
  14. 卡迪夫大学计算机和信息技术管理研究方向,卡迪夫大学研究生GPA要求
  15. js实现文字按照首字母排序
  16. 工具软件推荐——GifCam
  17. android面试题(深度解析)
  18. 小程序用vue开发可以吗,vue直接开发小程序
  19. 精品连载丨安卓 App 逆向课程之四 frida 注入 Okhttp 抓包中篇
  20. 润达软件:双十一临近,百度商城悄然上线

热门文章

  1. 1111 复习 形状的打印
  2. 解决 吃货阶段02 0928
  3. 开通qq邮箱的smtp服务的流程详情
  4. django-模板的转义
  5. BGP/MPLS *** Option B 跨域研究实验
  6. 设置windows网络连接别名和linux网络连接别名
  7. .NET中使用Redis
  8. Bean context must contain FilterChainProxy
  9. mysql语句修改zencart产品原价为特价的倍数
  10. HTCondor运行Java文件