jvm与程序的生命周期
yls 2019/11/5
java虚拟机结束生命周期的情况:
- 执行了System.exit();
- 程序正常运行结束
- 程序在执行过程中遇到异常或错误而异常终止
- 由于操作系统出现错误而导致jvm进程终止(不可人为控制)
类的加载,连接(验证,准备,解析),初始化,使用,卸载
- 加载:jvm通过类加载器查找并加载类的二进制数据,将类的.class文件中的二进制数据读入到内存,将其放在运行时的数据区的方法区中,然后在内存中创建一个java.lang.Class对象用来来封装类在方法区中的数据结构
- .class加载方式
- 从本地系统中加载
- 网络下载.class文件
- 从zip,jar中加载
- 将java源文件动态编译为.class文件
- 查看是否被加载,打印加载类的信息
- 在vm options中输入
-XX:+TraceClassLoading
-XX:+<option> 表示开启option选项
-XX:-<option> 表示关闭option选项
-XX:<option>=<value> 表示将option的值设置为value
- 在vm options中输入
- .class加载方式
- 连接:
- 验证:确保被加载的类的正确性(验证内容:1.类文件的结构检查,2.语义检查,3.字节码验证,4.二进制兼容性的验证)
- 准备:为类的静态变量分配内存,并将其初始化为默认值
- 解析:把类中的符号引用转换为直接引用,在类型的常量池中寻找类,接口,字段和方法的符号引用,把这些符号引用替换成直接引用的过程
- 初始化:为类的静态 变量 赋予正确的初始值
- 类的初始化时机:
- java虚拟机初始化一个类时,要求它的父类必须被初始化,但这条接口并不适合接口
- 初始化一个类时,并不会先初始化他的接口
- 初始化一个接口时,并不会先初始化他的父接口
- 只有当程序首次使用接口的常量时,才初始化接口
注意:
- (静态常量(例如:public static final int b=1;)在编译时就被存到调用该常量的方法的的类的常量池中,所以使用该常量不会导致定义该常量的类的初始化; > 当一个常量的值并非编译器可以确定地(例如:public static final String s= UUID.randomUUID().toString()),那么其值就不会被放到调用类的常量池中,这时在程序运行时,会导致主动使用这个常量所在的类,显然会导致这个类初始化)
- (使用子类调用父类的静态变量不会导致该子类的初始化,由于使用的是父类中的静态变量,所以不会初始化子类,只有直接调用了该静态字段的类才会被初始化)
- 类的初始化时机:
- java程序对类的使用可分为主动使用和被动使用,只有在每个类或接口被java程序“首次主动使用时”才 初始化 他们:
- 主动使用(7种)
- 创建类的实例(注意:引用数组
Grandpa[] grandpas=new Grandpa[1];
不是主动使用,不会导致类的初始化 ) - 访问类或接口的静态变量,或者为静态变量赋值
- 调用类的静态方法
- 反射(如Class.forName(***))
- 初始化类的子类
- jvm启动时被标记为启动的类
- 动态语言的支持(了解即可)
- 创建类的实例(注意:引用数组
- 除了以上情况,都是被动使用,不会导致类的初始化
- 主动使用(7种)
- 类实例化
- 为新的对象分配内存
- 为实例变量设置默认值
- 为实例变量赋予正确的初始值
- java编译器为类中每一个构造函数都生成一个初始化方法,在java的.class文件中,这个实例初始化方法被称为“”
- 类的卸载
- 一个类何时结束生命周期,取决于他的Class对象何时结束生命周期,当一个类的Class对象不在引用,即不可触及时就会结束
类加载器种类及关系
- 根类加载器:没有父加载器
- 扩展类加载器:父加载器是根加载器
- 系统类加载器:父加载器是扩展加载器
- 用户自定义类加载器:父加载器是系统加载器
类加载器双亲委托机制
- 加载器加载.class文件时,先自底向上委托给父加载器加载,若父加载器加载失败,则返回
- 好处:
- 可以确保java核心库的类型安全,所有java应用都会引用java.lang.Object类,所以这个类会被加载到java虚拟机中;如果这个加载过程是由java应用自己的加载类完成,很可能会加载多个不兼容的Object类 借助双亲委托机制,java核心库的加载工作都是由启动类加载类同意完成,确保只有一个版本
- 可以确保java核心库所提供的类不会被自定义的类所替代
- 不同的类加载器可以为相同名称的类(binary name)创建额外的命名空间。相同名称的类可以共存在jvm中,只需要用不同的类加载器加载即可。不同类加载的类之间是不兼容的,相当于在jvm内部创建了一个又一个相互隔离的java类空间
jvm与程序的生命周期的更多相关文章
- asp.net MVC 应用程序的生命周期
下面这篇文章总结了 asp.net MVC 框架程序的生命周期.觉得写得不错,故转载一下. 转载自:http://www.cnblogs.com/yplong/p/5582576.html ...
- 微信小程序之生命周期(三)
[未经作者本人同意,请勿以任何形式转载] 上一篇介绍微信小程序开发工具使用和项目目录结构. 这一章节介绍微信小程序的生命周期,什么是生命周期呢? 通俗的讲,生命周期就是指一个对象的生老病死. 从软件的 ...
- [ios基础]IOS应用程序的生命周期问题
—程序的生命周期 a.程序的生命周期是指应用程序启动到应用程序结束整个阶段的全过程 b.每一个IOS应用程序都包含一个UIApplication对象,IOS系统通过该U ...
- 2. iOS程序的生命周期
程序启动-生命周期 来自: QQ: 853740091 1.首先讲解UIApplication对象 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个 ...
- 浅析 - iOS应用程序的生命周期
1.应用程序的状态 状态如下: Not running 未运行 程序没启动 Inactive 未激活 程序在前台运行,不过没有接收到事件.在没有事件处理情况下程序通 ...
- 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的生命周期和程序的生命周期
[源码下载] 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的 ...
- iOS 应用程序的生命周期
iOS 应用程序的生命周期(网络资源总结) http://blog.csdn.net/totogo2010/article/details/8048652 http://www.cocoachina. ...
- UI1_应用的程序的生命周期
// // AppDelegate.m // UI1_应用的程序的生命周期 // // Created by zhangxueming on 15/6/29. // Copyright (c) 201 ...
- iOS程序的生命周期
任何程序的生命周期都是指程序加载到程序结束这一段时间. 在iOS应用程序中,通过单击主页面上的图标的方式可以启动一个程序.单击后,系统会显示一个过渡界面,然后调用main()函数来加载程序.从这一刻开 ...
随机推荐
- 2019滴滴php面试总结 (包含面试题解析)
2019滴滴java面试总结 (包含面试题) 本人6年开发经验.今年年初找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.滴滴等公司offer,岗位是既有php也有Java后端开发,最终选择去了滴滴 ...
- 动画讲解TCP
前言 TCP 三次握手过程对于面试是必考的一个,所以不但要掌握 TCP 整个握手的过程,其中有些小细节也更受到面试官的青睐. 对于这部分掌握以及 TCP 的四次挥手,小鹿将会以动画的形式呈现给每个人, ...
- Spring整合Mybatis(IDEA版)
本文适用于初学者: 该文主要教大家如何整合spring和mybatis,整合完成效果,可以从数据库中查询出学生信息: 完整的工程目录如下: 整合思路: 需要spring来管理数据源信息. 需要spri ...
- Ubuntu 19.10 发布 | 云原生生态周报 Vol. 24
作者 | 木苏.进超.冬岛.元毅.心水.衷源 业界要闻 1.云原生编程语言 Pulumi 1.0 pulumi ,一款中立的开源云开发平台,Pulumi 支持多语言.混合云环境.完全可扩展.初期支持 ...
- 13.Linux文件查找-find命令
find 命令的基本语法如下: 命令 路径 选项 表达式 动作 find [path...] [options] [expression] [action] 查找 地区 妹纸 18-25岁 约? (1 ...
- webpack 4 移除 CommonsChunkPlugin,取而代之的是两个新的配置项(optimization.splitChunks 和 optimization.runtimeChunk
默认方式 webpack模式模式现在已经做了一些通用性优化,适用于多数使用者. 需要注意的是:默认模式只影响按需(on-demand)加载的代码块(chunk),因为改变初始代码块会影响声明在HTML ...
- Spring Boot2 系列教程(十八)Spring Boot 中自定义 SpringMVC 配置
用过 Spring Boot 的小伙伴都知道,我们只需要在项目中引入 spring-boot-starter-web 依赖,SpringMVC 的一整套东西就会自动给我们配置好,但是,真实的项目环境比 ...
- zepto源码分析·event模块
准备知识 事件的本质就是发布/订阅模式,dom事件也不例外:先简单说明下发布/订阅模式,dom事件api和兼容性 发布/订阅模式 所谓发布/订阅模式,用一个形象的比喻就是买房的人订阅楼房消息,售楼处发 ...
- Mysql数据库(十)MySQL性能优化
一.优化概述 为了提高MySQL数据库的性能,不要进行一系列的优化措施.如果MySQL数据库需要进行大量的查询操作,那么就需要对查询语句进行优化.对于耗费时间的查询语句进行优化,可以提高整体地查询速度 ...
- spring源码学习(二)
本篇文章,来介绍finishBeanFactoryInitialization(beanFactory);这个方法:这个方法主要是完成bean的实例化,invokeBeanFactoryPostPro ...