一:Java虚拟机与程序的生命周期,如下几种情况Java虚拟机将结束生命周期
1,执行System.exit()方法
2,程序正常执行结束
3,程序执行过程中遇见到了异常或错误而异常终止
4,由于系统错误而导致Java虚拟机进程终止
二:Java程序对类的使用方式
1,主动使用(6种)
1):创建类的实例
2):访问某个类或静态变量,或者对静态变量赋值
3):调用类的静态方法
4):反射(如:Class.forName(“com.fov.IOTest”))
5):初始化一个类的子类
6):Java虚拟机启动的时候被标明的启动类(例如包含main方法的类)
*只有当程序访问类的静态变量或静态方法确实在当前类或当前接口中定义时,才可以认为是对类或接口的主动使用
当Java虚拟机初始化一个类的时候,要求它所有的父类都要被初始化,但是这不适合接口
*1):在初始化一个类的时候,并不会初始化它实现的接口
*2):在初始化一个接口的时候,并不会初始化它的父接口
因为一个父接口并不会因为它的子接口或者实现类被初始化而被初始化,只有当程序首次使用特定接口的静态变量的时候才会被初始化。
2,被动使用
除去主动使用外的都为被动使用
Java虚拟机必须在每个类或者接口被首次主动使用的时候才初始化他们
三:类的加载,连接与初始化
1,加载:是将类的.class文件的二进制文件读到内存中,将其放在运行时数据区的方法区里面,然后在堆内存创建一个java.lang.Class对象,用来封装在方法区内的数据结构。
1)加载类的方式:
1)),从本地系统中直接加载
2)),通过网络下载.class文件
3)),从zip,jar等归档文件中加载.class文件
4)),从专有的数据库中提取.class文件
5)),将Java源文件动态的编译为.class文件
2)类加载器种类:
1)),Java虚拟机自带的加载器
1))):根类加载器(Bootstrap)(c++编写无法在java代码中获得该类)
2))):扩展类加载器(Extension)(java实现)
3))):系统加载器(System)(java实现)
2)),用户自定义的类加载器
1))):java.lang.ClassLoader的子类
2))):用户可以通过定制类的加载方式
3),类加载器时间
1)):JVM允许类加载器在预料到某个类将要被使用的时候就预先加载它,如果预先加载的过程中遇到了某.class文件缺失或者错误,那么类加载器在程序首次使用该类的时候才报告错(LinkageError错误)
2)):如果该类一直没有被程序主动使用,那么类加载器就不会报告错误。
4),类加载器的父亲委托机制(Parent Delegation)
1)):根加载器(Bootstrap):该加载器没有父加载器。它负责加载虚拟机的核心类库,如 :java.lang.*,根加载器从系统属性sun.boot.class.path所指定的目录中加载类库,根加载器的实现依赖地层操作系统,它并没有继承java.lang.ClassLoader类
2)):扩展类加载器(Extension):它的父加载器为根类加载器〈父子加载器并不一定是继承关系〉,它从java.ext.dirs系统属性所指的目录中加载类库,或者从JDK的安装目录的jre//lib//ext子目录下加载类库,如果把用户创建的JAR文件放在这个目录下会自动被加载,该类是java.lang.ClassLoader类的子类。
3)):系统类加载器(System),也称为应用类加载器,它的父加载器为扩展加载器,它从环境变量classpath或者系统属性java.class.path所指定的目录加载类,它是用户自定的类加载器的默认父加载器,系统加载器是纯java类,是java.lang.ClassLoader类的子类。
5),定义类加载器
1)),如果某个类加载器能够加载一个类,那么该类加载器就称为定义类加载器,定义类加载器及起所有的子加载器都称为:初始类加载器
2)),当生成一个自定义的类加载器实例时,如果没有指定它的父加载器,那么系统加载器将是该类的父加载器。
3)),要创建类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,该方法根据参数指定的类的名字返回对应的Class对象的引用。
2,连接:
1)验证:确保被加载的类的正确性
类被加载后,就进去到连接阶段,连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去。
验证内容:类文件结构检查,语义检查,字节码验证,二进制兼容性的验证
2)准备:为类的静态常量分配内存,并将其初始化为默认值
3)解析:把类中的符号引用转换为直接引用
3,初始化:为类的静态的变量赋予正确的初始值<用户所赋值>
类的初始化步骤
1),假如该类没有被加载和连接,那就先进行加载和连接
2),假如该类存在直接父类,并且该父类没有被初始化,那就初始化该类的父类(跟构造方法一样)<接口不会,只有当程序首次使用特定接口的静态变量的时候才会导致该接口被初始化>
3),假如该类中存在初始化语句,那就依次初始化这些语句。
类的初始化就是上面的6种主动方式,其他的被动使用都不会导致类的初始化
- 大小: 56.4 KB
- 大小: 13.2 KB
- 大小: 72.7 KB
分享到:
相关推荐
1.Java 基本功 1.1.Java 入门(基础概念与常识) 1.1.1.Java 语言有哪些特点? 1.1.2.关于 JVM JDK 和 JRE 最详细通俗的解答 1.1.2.1.JVM 1.1.2.2.JDK 和 JRE 1.1.3.Oracle JDK 和 OpenJDK 的对比 1.1.4.Java 和 C++...
Java的一些基本概念,Java的起源、为什么我们要学习Java语言,Java跨平台原理剖析;Java环境变量的配置,初学者常犯的问题,Java语言的基本数据类型和Java的语句。 Java面向对象编程,面向对象编程和面向过程编程的...
HerdDB支持事务和“提交读取”隔离级别HerdDB使用Apache Calcite作为SQL解析器和SQL Planner基本概念像任何SQL数据库一样,数据以表的形式组织,并且表在Tablespaces中分组。 表空间是构建复制的基础架构砖,并且...
掌握基本的JVM优化策略。 实训项目二:T-DMS V1项目开发 第三阶段(以T-DMS V2项目贯穿) SQL语言 SQL语句基础和提高、SQL语句调优。 熟练的掌握SQL语句;掌握一定的数据库查询技巧及SQL语句优化技巧。 Oracle数据库...
二:服务介绍: 1) 服务的注册与发现 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、...
73、线程的基本概念、线程的基本状态以及状态之间的关系 18 74、sleep() 和 wait() 有什么区别? 18 75、socket通信(tcp/udp区别及JAVA的实现方式) 18 76、什么是java序列化,如何实现java序列化? 18 77、简述...
73、线程的基本概念、线程的基本状态以及状态之间的关系 18 74、sleep() 和 wait() 有什么区别? 18 75、socket通信(tcp/udp区别及JAVA的实现方式) 18 76、什么是java序列化,如何实现java序列化? 18 77、简述...
51.1. 线程的基本概念 23 51.2. Java中的线程有四种状态 23 51.3. 多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 24 51.4. 线程同步的方法。 24 51.5. java中有几种方法可以实现一个线程?用什么...
180多页面试题,前前后后不间断的更新了两年,准备换工作时,总是拿来看看,有比较好的面试题,也不间断的更新,面试题目录...2、基本概念 179 3. ZooKeeper典型应用场景 183 4、ZooKeeper在大型分布式系统中的应用 189
面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化...
面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多...
Android Android Android Android 手机新概念 操作系统的选择 -------- 定制和长尾 � 重构 � MVC 和 Web APP 架构 Android Android Android Android 开发背景 � 计算技术、无线接入技术的发展,使嵌入式系统逐渐...
53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序...
53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序...
53、线程的基本概念、线程的基本状态以及状态之间的关系 54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 ...
53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序...
53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序...
53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序...
53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出...