《深入理解JVM.2nd》笔记(三):垃圾收集器与垃圾回收策略
概述 1960年诞生于MIT的Lisp是 第一门 真正使用 内存动态分配 和 垃圾收集技术 的语言。 当Lisp还在胚胎期,人们就在思考GC需要完成3件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 经过多年发展,垃圾收集器与内存分配技术日臻完善, 为什么还有去了解GC和内存分配 ? 因为当需要排查各种内存溢出、内存泄露问题时,当垃圾收集称为系统达到 更高并发量的瓶颈 时,就需要对这些“自动化”的技术实施必要的 监控 和 调节 。 在Java内存运行时区域中, PCR、 VM Stack、 Native Method Stack 3个区域与线程同生共死 。 栈中的栈帧随着方法的进入和退出而有条不紊地执行者出栈和入栈的操作。每一栈帧中分配多少内存基本上是在类结构确定下俩就已知的。 因此这几个区域内存分配和回收都具备确定性,所以无需多虑, 内存随着方法结束或者线程结束而回收 。 Java堆 和 方法区与这3区域的不同。 一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,这能在程序运行期间才能知道会创建哪些对象,这部分内存分配和回收都是动态。 GC所关注的是这部分内存。 对象已死吗 GC在堆进行回收前,第一件事就是要哪些对象是“活”的,哪些是“死”的。 引用计数算法 引用计数算法 Reference Counting 思路:给对象中添加一个