类加载器
类加载器
加载:
全限定类名获取此类的二进制字节流,其静态存储结构转化为方法区运行时的数据结构如栈,堆,红黑树,二叉搜索树,哈希表。,内存中生成代表类的java.lang.Class对象,作为类中方法区的数据访问入口
验证:
(1)文件格式验证,(2)元数据验证,(3)字节码验证,(4)符号引用验证
准备:
在方法区为类变量分配内存并设置类变量初始值
解析:
为支持运行时绑定,有时在初始化之后才开始
解析即虚拟机将常量池内的富豪引用替换为直接饮用的过程,针对类,接口,字段,类方法,接口方法,方法类型,方法句柄和调用点限定符
初始化:
执行类中定义的Java程序代码,执行clinit()方法的过程
垃圾回收
垃圾回收:
优点:有效避免内存泄漏
Java堆和方法区(永久代)为主要的回收区域
相关概念:Stop-the-world:JVM执行GC停止应用程序的执行,在任何GC算法中都可以发生。除了GC所需线程,所有线程都处于等待状态知道GC任务完成。GC优化很多时候指减少Stop-the-World发生的时间,使得系统有高吞吐,低停顿特点
引用计数法:
判断对象的引用数量,任何引用计数为0的对象实例都可以当作垃圾收集
可达性分析算法:判断对象的引用链是否可达决定,
标记清除算法:
分为标记和清除两个阶段:先从根集合进行扫描,对存活的对象标记,标记后再扫描整个空间中未被标记的对象进行回收。
复制算法:
将可用内存划分为大小相等的两块,每次只使用一块,当这一块内存用完后将存活的对象复制到另一块,最后对已使用的内存空间进行一次清理。如商用虚拟机回收新生代。
标记整理算法:
类似于标记清除算法,区别在于该算法是让所有存活的对象都向着一端移动,然后直接清理端边界以外的内存,类似于磁盘清理,适用于对象存活率高的场景,如老年代。
分代收集算法:
利用不同对象生命周期不同,以及不同生命周期的对象位于堆中不同的区域,对堆内存不同区域采用不同策略进行回收,从而提高效率。