1.JVM类加载:把.class文件加载到内存,得到类对象这样的过程
类加载的过程:加载、验证、准备、解析、初始化
加载:找到.class文件,并读取文件内容
验证:确保.class文件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求
准备:给类对象分配内存空间
解析:针对字符串常量进行初始化
初始化:执行类构造器方法的过程
双亲委派模型:发生在类加载的第一个步骤的找.class文件这个过程
JVM内置了三个类加载器:
Bootstrap ClassLoader:负责加载java标准库中的类
Extension ClassLoader:负责加载非标准库的类但是Sun/Oracle扩展的类
Application ClassLoader :负责加载项目中自己写的类以及第三方库的类
三者的关系是Bootstrap ClassLoader是Extension ClassLoader的父类;Extension ClassLoader是Application ClassLoader的父类
当Application ClassLoader这个加载器收到了类加载的请求,它先不会去执行这个请求即不会自己尝试去加载这个类,而是把这个请求委派给父类Extension ClassLoader这个加载器,此时这个Extension这个加载器也不会自己尝试加载这个类,也是把这个请求委派给父类Bootstrap ClassLoader,这个加载器也是如此。当Bootstrap ClassLoader这个加载器没有父类时,先尝试在自己的区域中找到这个类,若无法完成这个加载的请求,则将反馈给子类Extension ClassLoader这个加载器去完成加载,Extension ClassLoader加载器也是如此。
2.垃圾回收(GC)
帮助程序员自动释放内存,能够有效的减少内存泄漏出现的概率
GC是以对象为单位进行释放的
一个对象如果后续再也不用了就可以认为是垃圾,即一个对象没有引用指向他,此时这个对象一定是无法被使用的
Ⅰ找垃圾
①引用计数算法
给对象增加一个引用计数器,放有引用指向它是,计数器就+1,当引用不指向它是,计数器就-1;任何时刻计数器为0时,可以认为是垃圾
②可达性分析算法(java实际采取的方法)
把对象之间的引用关系理解成一个树形结构,从一些特殊的起点(GC Root)出发,进行遍历。只要能遍历访问到的对象,就是可达,再把不可达的当成垃圾。
可以作为GC Root的对象包含以下几种:
(1)虚拟机栈中引用的对象
(2)方法区中类静态属性引用的对象
(3)方法区中常量引用的对象
(4)本地方法栈中引用的对象
Ⅱ垃圾回收
①标记清除算法
标记出需要回收的垃圾,在标记完成后统一回收被标记的对象。
②复制算法
将内存划分成两个块每次使用其中一块。当这个内存需要进行垃圾回收时,将不是垃圾的复制到另外一块区域上,然后把使用的这一块内存进行垃圾回收处理。
③标记整理算法
标记出需要回收的垃圾,让所有不是垃圾的都移动到另外一端,然后直接清理掉端边界以外的内存
④分代算法
根据对象存活周期的不同将内存划分为新生代和老年代。在新生代中,每次垃圾回收都有大批的对象死去,只有少量存活,因此我们采用复制算法,而老年代中对象存活率较高,没有额外空间对他进行分配担保,就必须采用标记清除或者标记整理算法。

被折叠的 条评论
为什么被折叠?



