Java虚拟机垃圾收集器与内存分配策略 概述 那些内存须要回收,什么时候回收.怎样回收是GC须要完毕的3件事情. 程序计数器.虚拟机栈与本地方法栈这三个区域都是线程私有的,内存的分配与回收都具有确定性,内存随着方法结束或者线程结束就回收了. java堆与方法区在执行期才知道创建那些对象,这部分内存分配是动态的.本章笔记中分配与回收的内存指的就是:java堆与方法区. 推断对象已经死了 引用计数算法:给对象加入一个引用计数器,每当有一个地方引用它,计数器+1;引用失败,计数器-1.计数器为0则改推…
Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,JDK1.6中Sun HotSpot虚拟机的垃圾收集器如下: 图中如果两个垃圾收集器直接有连线,则表明这两个垃圾收集器可以搭配使用. (1).Serial垃圾收集器: Serial是最基本.历史最悠久的垃圾收集器,使用复制算法,曾经是JDK1.3.1之前新生代唯一的垃圾收集器. Serial是一个单线程的…
Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,JDK1.6中Sun HotSpot虚拟机的垃圾收集器如下: 图中如果两个垃圾收集器直接有连线,则表明这两个垃圾收集器可以搭配使用. (1).Serial垃圾收集器: Serial是最基本.历史最悠久的垃圾收集器,使用复制算法,曾经是JDK1.3.1之前新生代唯一的垃圾收集器. Serial是一个单线程的…
1.概述 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现.Java虚拟机规范中对垃圾收集器应该如何实现并没有规定,因此不同的厂商.不同版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器.这里讨论的收集器基于JDK 1.7 Update 14之后的HotSpot虚拟机(在这个版本中正式提供了商用的G1收集器,之前G1仍处于实验状态). 1.1 垃圾收集器组合 这个虚拟机包含的所有收集器如图所示:…
一.判断对象存活的算法 1.引用计数(Reference Counting)算法 给对象添加一个引用计数器,每当有一个地方引用时,计数器加1.当引用失效时,计数器减1.当计数器的值为0的时候说该对象不可能再被使用.引用计数器算法的实现简单,效率高,比如微软的COM(Component Object Model)技术,Python等.但是Java虚拟机没有使用该技术,因为该技术难以解决对象循环依赖的问题,即A中有B,B中有A这种情况. 2.可达性分析(Reachability Anlysis)算法…
垃圾收集器(Garbage Collection, GC)的诞生引导出了三个问题: 哪些内存需要回收? 什么时候回收? 如何回收? 对于线程独占的三个区域(程序计数器.虚拟机栈.本地方法栈)不用过多的考虑垃圾回收的问题,因为他们随着线程创建而生,随着线程结束而消失.然而Java堆和方法区则不一样,一个接口的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也不一样,我们只有在程序运行的的时候才知道会创建哪些对象,这部分的内存分配是动态的,所以这也是GC所关注的方面. 如何判断对象已死…
垃圾收集器和内存分配 程序计数器.虚拟机栈.本地方法栈这三个区域和线程的生命周期一致,所以方法结束或者线程结束时,内存自然就跟着回收了.Java堆和方法区,只有在程序处于运行期间才能知道会创建哪些对象,即这部分的内存分配和回收都是动态的,垃圾回收主要关注的是堆内存. 对象存活判断 在进行垃圾回收之前,首先要判断哪些对象还存活,哪些已经死去去.判断对象存活的方法,有如下几种: 引用计数法 每个对象有一个引用计数器,每当有一个地方引用了它计数+1:引用失效计数器-1:当引用计数为0时,说明这个对象在…
引用计数算法 很多教科书判断对象是否存活的算法是这样的:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器都为0的对象就是不可能再被使用的. 客观地说,引用计数算法(Reference Counting)的实现简单,判定效率也很高,在大部分情况下它都是一个不错的算法,也有一些比较著名的应用案例,例如微软的COM(Component Object Model)技术.使用ActionScript 3的FlashPlayer.Python语…
1.  前言 内存分配与回收策略 JVM堆的结构分析(新生代.老年代.永久代) 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保  2.  垃圾收集器与内存分配策略 Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题: 给对象分配内存; 回收分配给对象的内存. 对象的内存分配,往大方向上讲就是在堆上的分配,对象主要分配在新生代的Eden区上.少数也可能分配在老年代,取决于哪一种垃圾收集器组合,还有虚拟机中的相关内存的参…
说起GC,我们要思考的主要有三件事 哪些内存需要回收 那些已经“死去”的对象,那么哪些对象“死”,哪些对象“活”呢,有个简单的办法 引用计数法,但是没法解决循环依赖问题 所以Java虚拟机采用的是可达性分析算法 这个算法通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,如果对象无法被搜到,那么这些对象会被标记为要清除的对象. 那么“GC Roots”又是什么?“GC Roots”主要有以下几种 活跃栈帧中的指向GC堆的引用,就是方法运行时的临时变量,引用参数 被加载的J…