内容简介:把"GC Roots"的对象作为起点,然后向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,即该对象不可达,也就说明此对象是不可用的。1、标记-清除算法:标记出所有需要回收的对象,标记完统一清除被标记的对象。缺点:
把"GC Roots"的对象作为起点,然后向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,即该对象不可达,也就说明此对象是不可用的。
1、标记-清除算法:标记出所有需要回收的对象,标记完统一清除被标记的对象。
缺点:
- 标记和清理的效率不高
- 标记清除后会产生大量不连续的内存碎片
2、复制算法:将内存分为大小相等的两块,每次只用一块,当这一块内存用完,将存活对象复制到另一块,将使用过的内存一次清理。
优缺点:
- 不会产生内存碎片的问题
- 缺点是将内存缩小到了之前的一半
- 在对象存活率高时进行多次复制操作,效率会低。
3、标记-整理算法:标记需要回收的对象,将存活对象向一端移动(整理),清理掉可回收的对象。
4、分代收集算法:根据对象存活周期不同,将 Java 堆内存分为新生代和老年代。
- 新生代:只有少量对象存活,使用复制算法。
- 老年代:大量对象存活,使用标记清除或者标记整理算法。
三、类加载机制
1、类加载时机
1、定义:
把Class文件加载到内存中,并对数据进行校验、解析和初始化,行成可被虚拟机直接使用的Java类型。类从被加载到虚拟机内存中开始,到卸载出内存结束。
2、生命周期:
- 加载
- 验证
- 准备
- 解析
- 初始化
- 使用
- 卸载 加载、验证、准备、初始化、卸载的顺序确定。
3、需要对类进行初始化的场景
- new实例化对象、读取或设置类的静态字段,调用类的静态方法(被final修饰,已在编译期将结果放入常量池的静态字段除外)
- 对类进行反射
- 初始化一个类,若父类还没初始化,先触发父类的初始化
- 需指定一个执行的主类(包含main方法的类),虚拟机先初始化该类
- JDK1.7动态语言,MethodHandle实例解析结果REF_getStatis、REF_putStatis、REF_invokeStatis的方法句柄
4、不会方法初始化的场景:
所有引用类的方式不会触发初始化,例如子类引用父类的静态字段,只触发父类初始化。
5、接口初始化和类初始化的区别:
接口初始化时,不要求其父类接口全部完成初始化。
2、类加载过程
包括加载、验证、准备、解析、初始化5步
1、加载:
- 通过类全限定名获取定义该类的二进制字节流
- 将字节流的静态存储结构转换为方法区的运行时数据结构
- 内存中生成该类的Class对象,作为访问该类数据的入口
2、验证:
- 文件格式验证,验证字节流是否符合Class文件格式规范
- 元数据验证,对字节码描述的信息进行语义分析
- 字节码验证,确定语义合法
- 符号引用验证,对常量池符号引用校验
3、准备: 为类变量(static修饰的变量)分配内存并设置变量初始值
4、解析: 将常量池符号引用替换为直接引用(直接指向目标的指针)的过程
5、初始化: 开始执行类中定义的Java代码
3、类加载器
同一个Class文件,被两个不同的类加载器加载,这两个类不相等。相等包括equals、instanceOf、isInstance方法返回的结果。
1、类别:
- 启动类加载器(Bootstrap ClassLoader):加载<JAVA_HOME>\lib目标,或者被-Xbootclasspath参数指定的路径,可被虚拟机识别的类库
- 扩展类加载器(Extension ClassLoader):加载<JAVA_HOME>\lib\ext目录,或被java.ext.dirs系统变量指定的路径的类库
- 应用类加载器(Application ClassLoader):加载ClassPath上指定的类库
2、双亲委托机制
除了顶层的类加载器外,其他的类加载器都有自己的父类加载器。父子之间通过组合来复用父加载器代码。
双亲委托机制的工作流程:一个类加载器收到类加载的请求,首先将请求委托给父类加载器去完成,最终所有加载请求都会传递给顶层的启动加载器中。当父加载器发现未找到所需的类而无法完成加载请求时,子加载器才尝试去加载。
ClassLoader
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { //检查请求的类是否已经被加载 Class<?> c = findLoadedClass(name); if (c == null) { try { if (parent != null) { //让父类加载器去尝试加载 c = parent.loadClass(name, false); } else { c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { //父类加载器抛异常 } if (c == null) { //然后调用自身的findClass方法来进行类加载 c = findClass(name); } } return c; } 复制代码
- 先检查是否被加载过,如果没有则调用父加载类去加载
- 父加载器为空,则调用启动类加载器
- 父加载器加载失败,则抛出ClassNotFoundException异常
- 然后去调用自身的findClass方法去进行类加载
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 【1】JavaScript 基础深入——数据类型深入理解与总结
- 深入理解java虚拟机(1) -- 理解HotSpot内存区域
- 深入理解 HTTPS
- 深入理解 HTTPS
- 深入理解 SecurityConfigurer
- 深入理解 HTTP 协议
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Unity Shader入门精要
冯乐乐 / 人民邮电出版社 / 2016-5-1 / CNY 69.00
本书不仅要教会读者如何使用Unity Shader,更重要的是要帮助读者学习Unity中的一些渲染机制以及如何使用Unity Shader实现各种自定义的渲染效果,希望这本书可以为读者打开一扇新的大门,让读者离制作心目中杰出游戏的心愿更近一步。 本书的主要内容为:第1章讲解了学习Unity Shader应该从哪里着手;第2章讲解了现代GPU是如何实现整个渲染流水线的,这对理解Shader的工......一起来看看 《Unity Shader入门精要》 这本书的介绍吧!
HTML 压缩/解压工具
在线压缩/解压 HTML 代码
JS 压缩/解压工具
在线压缩/解压 JS 代码