jvm学习笔记:一、类的加载、连接、初始化
2024-09-05 13:53:02
- 在JAVA代码中,类型的加载、连接与初始化过程都是程序运行期间完成的。
- 类型的加载:将已经存在的class从硬盘加载到内存。
- 类型的连接:将类与类之间的关系确定好。
- 类型的初始化:类型 静态的变量进行赋值。
- 类加载器(classLoader)的深入剖析
- 每一个类都是由类加载器加载到类型当中
- 在以下代码中,java虚拟机会结束生命周期:
- 执行System.exit()方法。
- 程序正常结束。
- 程序在执行中遇到异常或者错误而异常终止。(没有去捕获异常,一直抛到main方法) - 由于操作系统出现错误,导致JAVA虚拟机进程终止。
- 加载、连接、初始化
- 加载:查找并加载类的二进制数据
- 连接:
- 验证:确保被加载类的正确性。
- 准备:为类的静态变量分配内存,并将其初始化为默认值。
例1:pulic static int a = 1; 会将0作为默认值赋值给a,而不是1. - 解析:把类中的符号(间接)引用转化为直接引用(通过指针)。
- 初始化:为类的静态变量赋予正确的初始值。
例2: 将例1中的a 赋值正确的初始值1;
- java程序对类对使用方式分为两种。
- 主动使用
- 被动使用
所有java虚拟机实现必须在每个类或接口被java程序“首次主动使用”时才会加载他们。
- 主动使用(七种)
- 创建类对实例 new User();
- 访问某个类或者接口对静态变量(getstatic),或者对静态变量赋值(putstatic)
- 调用类对静态方法 (invokestatic)
- 反射 (Class.forName("com.chen.Test"))
- 初始化一个类对子类 (初始化类 child类,也是对parent类进行初始化 child extend parent)
- JDK1.7 提供动态语言的支持(java.lang.invoke.MethodHandle实例的解析结果REF_getStatic,REF_putStatic,REF_invokeStatic句柄对应的类没有初始化,则初始化)
- 被动使用:
- 除了其他七种情况外,其他使用java类的方式都被看做类的被动使用,都不会导致类的初始化(但可以被加载和连接)
- 类的加载
- 类的加载指 类的CLass的二进制数据读入到内存当中,将其放在运行时数据区的方法区内,然后在内存中创建一个java.lang.Class对象(规范并未说明Class对象在哪里,HotSpot虚拟机将其放在方法区内)用来封装类在方法区内的数据结构。
- 类的加载方式
- 从本地系统中直接加载
- 通过网络下载.class文件加载
- 从jar zip 等归档中加载.class文件
- 从专有数据库中提取.class
- 将java源文件动态编译为.class文件
最新文章
- Android数据加密之SHA安全散列算法
- 对iOS10新增Api的详细探究
- 元素绝对定位以后设置了高宽,a标签不能点击的原因总结
- 全选,不选,反选js
- Linux常用命令大全(share)
- 如何初始化一个iOS原生地图
- Prime Land
- VS2012 中使用Emacs布局
- PAT 团体程序设计天梯赛-练习集L1-011. A-B
- freemarker之include指令(九)
- COM接口调用,CreateDispatch失败的问题
- sql 重复数据查询
- 创建目录:mkdir
- XML 可扩展标记语言
- SQL还原后:目录名称无效
- File、Directory、Path
- Executor框架(四)周期/延时任务ScheduleThreadPoolExecutor
- SASS 入门
- Task 4.3 求环形数组的最大子数组和
- spring-boot分环境打包为jar包
热门文章
- [React] Always useMemo your context value
- [新版] CASthesis 模板编译的问题
- Python 简易Cmd控制
- 138企业邮箱pop/imap和smtp服务器地址
- zabbix企业微信告警配置教程
- [CSP-S模拟测试]:射手座之日(dsu on tree)
- MySQL:如何选取Table中的50到100行
- linux下无root源码安装软件
- System.Runtime.CompilerServices.Unsafe
- Git clone 报错 128