栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

总结类加载的过程——javaee进阶

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

总结类加载的过程——javaee进阶

目录

一.类的加载过程

1.1分为三大阶段

1.2 加载

1.3验证

1.4准备

1.5解析

1.6初始化

1.7卸载

二.双亲委派模型

2.1优点:

2.2缺点:


一.类的加载过程

1.1分为三大阶段

加载:查找并且加载类的二进制数据

链接:

验证:确保被加载类的正确性

准备:为类的静态变量分配内存,并将其初始化为默认值

解析:把类中的符号引用转换为直接引用

初始化:执行构造方法

1.2 加载


类加载过程的第一步,主要完成下面3件事情:

通过全类名获取定义此类的二进制字节流
将字节流所代表的静态存储结构转换为方法区的运行时数据结构
在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口
一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,这一步我们可以去完成还可以自定义类加载器去控制字节流的获取方式(重写一个类加载器的 loadClass() 方法)。数组类型不通过类加载器创建,它由 Java 虚拟机直接创建。

1.3验证


主要目的:检查输入的字节流。为了确保当前加载的Class字节流符合虚拟机的要求,不会危害到虚拟机

检验动作

文件格式验证。判断当前字节流是否符合Class文件格式要求。
原数据验证。语义分析,判断数据类型是否符合Java语言规范
字节码验证。判断方法是否符合Java语言规范
符号引用验证。判断能否找到所引用的类


1.4准备


目的:给类中静态变量赋予初值,其他的变量随着类的初始化,跟类存放在堆中

1.5解析


目的:将常量池中的符号引用变成直接引用

1.6初始化


目的:初始化是类加载的最后一步,初始化阶段是执行类构造器 ()方法的过程

1.7卸载


卸载类即该类的Class对象被GC。

卸载类需要满足3个要求:

该类的所有的实例对象都已被GC,也就是说堆不存在该类的实例对象。
该类没有在其他任何地方被引用
该类的类加载器的实例已被GC
所以,在JVM生命周期类,由jvm自带的类加载器加载的类是不会被卸载的。但是由我们自定义的类加载器加载的类是可能被卸载的。
 

二.双亲委派模型

优点:
  1. 避免重复加载某类
  2. 避免系统API被篡改

缺点:

双亲委派模型缺点/什么场景会大批双亲委派模型

Java SPI -> JDBC

  1. 为什么要有垃圾回收?——》在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象;而在Java中,当没有对象引用指向原先分配给某个对象 的内存时,该内存便成为垃圾。 垃圾回收能自动释放内存空间,减轻编程的负担,JVM的一个系统级线程会自动释放该内存块。垃圾回收意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。当一个对 象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放没用的对象,垃圾回收也可以清除内存记录碎片。由于创建对象和垃圾回收器释放丢弃对象所占的内存空间,内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆的一端,JVM将整理出的内存分配给新的对象
  2. 垃圾回收主要回收哪个内存区域?——》主要回收两部分内容:废弃的常量和不再使用的类型。
  3. 标记的过程(见图)
  4. 回收的过程(见图)
  5. 垃圾回收器有哪些典型实现?

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/998102.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号