java虚拟机-01-类的加载

本贴最后更新于 4346 天前,其中的信息可能已经沧海桑田

一、java虚拟机结束生命周期的条件
1、程序正常结束
2、执行system.exit()
3、程序出现异常或错误而非正常结束
4、操作系统出现错误

二、类的加载、连接与初始化
1、加载:查找并加载类的二进制数据
     a、定义:类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang. Class对象,用   来封装类在方法区内的数据结构。
     b、方式:I、从本地系统中直接加载
                   II、通过网络下载.class文件
                   III、从zip、jar等归档文件中加载.class文件
                   IV、从专有的数据库中提取.class文件
                   V:将java源文件动态编译成.class文件
2、连接
    a、验证:确保被加载的类的准确性
         I、类文件的结果检查
         II、语义检查
         III、字节码检查
         IV、二进制兼容的验证
    b、准备:为类的静态变量分配内存,并将其初始化为默认值
    c、解析:吧类中符号引用转换为直接引用
3、初始化:为类的静态变量赋予正确的初始值

三、类的使用方式
1、主动使用:所有的java虚拟机实现必须在每个类或接口被java程序“首次主动使用”是才初始化他们
    a、创建类的实例
    b、访问某个类或接口的静态变量,或者对静态变量赋值
    c、调用类的静态方法
    d、反射
    e、初始化一个类的子类
    f、java虚拟机启动时被标明为启动类的类
2、被动使用

四、类加载器的类型
1、java虚拟机自带的加载器
    a、跟类加载器(Bootstrap)
    b、扩展类加载器(Extension)
    c、系统类加载器(System)
2、用户自定义的类加载器
java.lang.ClassLoader的子类

五、类的初始化步骤
1、假如这个类还没有被加载和连接,那就先进行加载和连接。
2、假如类存在直接的父类,并且这个父类还没有被初始化,那就先初始化直接的父类。
3、假如类中存在初始化语句,那就依次执行这些初始化语句。

六、类的初始化的前提条件
1、初始化一个类时,要求它的所有父类都已经被初始化,但是,这条规则并不适用于接口。
2、在初始化一个类时,并不会先初始化它所有实现的接口。
3、在初始化一个接口时,并不会先初始化它的父接口。
4、只有当程序首次使用特定接口的静态变量时,才会导致该接口的初始化。
5、调用ClassLoader的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化。

七、类加载的父委托机制
1、定义:在此委托机制中,除了java虚拟机在带的根加载器以外,其余的类加载器都有且只有一个父加载器。当java程序请求加载器加载一个类时,该加载器会首先委托父加载器去加载该类,如果父加载器不能加载该类,才会由该加载器进行加载
2、加载器顺序:用户自定义加载器 -> 系统类加载器 -> 扩展类加载器 -> 根类加载器

八、命名空间
每个类加载器都有自己的命名空间,命名空间由该加载器及所有父加载器所加载的类组成。在同一个命名空间中,不会出现类的完整名字相同的两个类。


九、运行时包
由同一类加载器加载的属于相同包的类组成了运行时包。决定两个类是不是属于同一个运行时包,不仅要看他们的报名是否相同,还要看他们的类加载器是否相同。只有属于同一运行时包的类才能相互访问。

十、类的卸载
当代表一个类的Class对象不再被引用,即不可触及时,Class对象就会结束生命周期,该类在方法区内的数据也会被卸载,从而结束该类的生命周期。由此可见一个类的生命周期取决于代表该类的Class对象何时结束生命周期。有java虚拟机自带的类加载器所加载的类,在虚拟机的生命周期内,始终不会被卸载。

  • 编程
    52 引用 • 257 回帖 • 3 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 2 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 1 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    45 引用 • 114 回帖 • 168 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 580 关注
  • Access
    1 引用 • 3 回帖 • 1 关注
  • OneNote
    1 引用 • 3 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 314 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    187 引用 • 831 回帖
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 820 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    437 引用 • 1238 回帖 • 587 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖 • 1 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 144 关注
  • danl
    174 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 48 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖 • 1 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 10 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 661 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 37 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    167 引用 • 408 回帖 • 489 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1432 回帖
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 614 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 1 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 73 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖 • 1 关注