本文共 9387 字,大约阅读时间需要 31 分钟。
问:垃圾收集器(GC)需要完成的三件事情:
答:1. 哪些内存需要回收?
2. 什么时候回收?
3. 如何回收?
问:为什么我们还要去了解GC和内存分配呢?
答:当需要排查各种内存溢出、内存泄露等问题时,当垃圾收集器成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节;
在堆里面存放的几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事就是确定这些对象中,哪些还“存活”着,哪些已经“死去”;
判断对象是否“存活”的算法:
引用计数算法(主流的虚拟机中没有选用引用计数算法进行内存管理,最主要的原因是它很难解决对象之间相互循环引用的问题):给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失败时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用。
!!可达性分析算法(主流的商用程序语言的主流实现中):通过一系列的成为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径成为引用链,每当一个对象到GC Roots没有任何引用链相连时(在图论中,就是从GC Roots到这个对象不可达),则证明此对象不可用。
在Java语言中,可作为GC Roots的对象包括下面几种:
1. 虚拟机栈(栈帧中的本地变量表)中引用的对象;2. 方法区中**类静态属性引用**的对象;3. 方法区中**常量引用**的对象;4. 本地方法栈中**JNI(即一般说的Native方法)引用**的对象;
生存还是死亡:即使在可达性算法中“不可达”的对象,也并非是“非死不可”,它们暂处于“缓刑”状态,要真正宣告一个对象死亡,需要经历两次标记过程:
回收方法区:在Java虚拟机规范中,可以不要求虚拟机在方法区实现垃圾回收,而且在方法区中实现垃圾回收的“性价比”比较低;
永生代(方法区)的垃圾收集主要回收两部分内容:
并行与并发 的概念:
Parallel Scavenge 收集器(无法与CMS收集器配合工作)(吞吐量):
转载地址:http://isgq.baihongyu.com/