深入理解java虚拟机--垃圾收集器】的更多相关文章

1.  前言 内存分配与回收策略 JVM堆的结构分析(新生代.老年代.永久代) 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保  2.  垃圾收集器与内存分配策略 Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题: 给对象分配内存; 回收分配给对象的内存. 对象的内存分配,往大方向上讲就是在堆上的分配,对象主要分配在新生代的Eden区上.少数也可能分配在老年代,取决于哪一种垃圾收集器组合,还有虚拟机中的相关内存的参…
引用计数算法 很多教科书判断对象是否存活的算法是这样的:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器都为0的对象就是不可能再被使用的. 客观地说,引用计数算法(Reference Counting)的实现简单,判定效率也很高,在大部分情况下它都是一个不错的算法,也有一些比较著名的应用案例,例如微软的COM(Component Object Model)技术.使用ActionScript 3的FlashPlayer.Python语…
博文重点: 学习目标:哪些内存需要回收 什么时候回收    如何回收 在基于概念讨论的模型中,主要对Java堆和方法区进行讨论. why?:一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样.只有在程序运行期间才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,gc关注的就是这一块内存. 哪些内存需要回收: 判断对象是否存活: 引用计数算法:对象中添加一个引用计数器,有一个地方引用它则计数器加1,引用失效时,减1.引用为0的对象就是不可使用的. 优点:实…
Overview 垃圾收集考虑三件事: 哪些内存需要回收? 什么时候回收? 如何回收? 重点考虑Java堆中动态分配和回收的内存. Is Object alive? 引用计数法 给对象添加一个引用计数器. 该方法实现简单,判定效率高.但是它很难解决对象之间相互循环引用的问题,因此几乎很少有JVM选用该方法.eg: public class ReferenceCountingGC { public Object instance = null; // 占点内存,以便在GC日志中看清楚是否被回收过…
对象的销毁 对象的finalize方法只会执行一次,在finalize里可以自救不被销毁,二次被主动gc,必定会销毁 类销毁…
Java虚拟机垃圾收集器与内存分配策略 概述 那些内存须要回收,什么时候回收.怎样回收是GC须要完毕的3件事情. 程序计数器.虚拟机栈与本地方法栈这三个区域都是线程私有的,内存的分配与回收都具有确定性,内存随着方法结束或者线程结束就回收了. java堆与方法区在执行期才知道创建那些对象,这部分内存分配是动态的.本章笔记中分配与回收的内存指的就是:java堆与方法区. 推断对象已经死了 引用计数算法:给对象加入一个引用计数器,每当有一个地方引用它,计数器+1;引用失败,计数器-1.计数器为0则改推…
[From] https://www.cnblogs.com/ASPNET2008/p/6496481.html 深入理解Java G1垃圾收集器 本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么?简单的说垃圾回收就是回收内存中不再使用的对象. 垃圾回收的基本步骤 回收的步骤有2步: 查找内存中不再使用的对象 释放这些对象占用的内存 1,查找内存…
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. 垃圾收集算法       JVM的垃圾收集算法在不同的JVM实现中有所不同,且在平时工作中一般不会深入到收集算法,因此只对算法做较为简单的介绍.       1.1 标记-清除算法           这种算法是非常直观的,也是最为基础的收集算法(Mark-Sweep)算法,这种算法将回收分为两个阶段:首先标记所有需要回收的对象,然后在完成标记后统一回收掉被标记的对象.这种算法是如此的基础,以至于后面的算法都是基于该思路,并对其确定进行改进所得的.           这种算法的缺点主要有…
原文地址:http://blog.jobbole.com/109170/?utm_source=hao.jobbole.com&utm_medium=relatedArticle 本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么?简单的说垃圾回收就是回收内存中不再使用的对象. 垃圾回收的基本步骤 回收的步骤有2步: 查找内存中不再使用的对象 释放…
本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么?简单的说垃圾回收就是回收内存中不再使用的对象. 垃圾回收的基本步骤 回收的步骤有2步: 查找内存中不再使用的对象 释放这些对象占用的内存 1,查找内存中不再使用的对象 那么问题来了,如何判断哪些对象不再被使用呢?我们也有2个方法: 引用计数法 引用计数法就是如果一个对象没有被任何引用指向,则可视之…
本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么?简单的说垃圾回收就是回收内存中不再使用的对象. 垃圾回收的基本步骤 回收的步骤有2步: 查找内存中不再使用的对象 释放这些对象占用的内存 1,查找内存中不再使用的对象 那么问题来了,如何判断哪些对象不再被使用呢?我们也有2个方法: 引用计数法 引用计数法就是如果一个对象没有被任何引用指向,则可视之…
本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么?简单的说垃圾回收就是回收内存中不再使用的对象. 垃圾回收的基本步骤 回收的步骤有2步: 查找内存中不再使用的对象 释放这些对象占用的内存 1,查找内存中不再使用的对象 那么问题来了,如何判断哪些对象不再被使用呢?我们也有2个方法: 引用计数法 引用计数法就是如果一个对象没有被任何引用指向,则可视之…
垃圾收集器(Garbage Collection, GC)的诞生引导出了三个问题: 哪些内存需要回收? 什么时候回收? 如何回收? 对于线程独占的三个区域(程序计数器.虚拟机栈.本地方法栈)不用过多的考虑垃圾回收的问题,因为他们随着线程创建而生,随着线程结束而消失.然而Java堆和方法区则不一样,一个接口的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也不一样,我们只有在程序运行的的时候才知道会创建哪些对象,这部分的内存分配是动态的,所以这也是GC所关注的方面. 如何判断对象已死…
一.判断对象存活的算法 1.引用计数(Reference Counting)算法 给对象添加一个引用计数器,每当有一个地方引用时,计数器加1.当引用失效时,计数器减1.当计数器的值为0的时候说该对象不可能再被使用.引用计数器算法的实现简单,效率高,比如微软的COM(Component Object Model)技术,Python等.但是Java虚拟机没有使用该技术,因为该技术难以解决对象循环依赖的问题,即A中有B,B中有A这种情况. 2.可达性分析(Reachability Anlysis)算法…
垃圾收集器和内存分配 程序计数器.虚拟机栈.本地方法栈这三个区域和线程的生命周期一致,所以方法结束或者线程结束时,内存自然就跟着回收了.Java堆和方法区,只有在程序处于运行期间才能知道会创建哪些对象,即这部分的内存分配和回收都是动态的,垃圾回收主要关注的是堆内存. 对象存活判断 在进行垃圾回收之前,首先要判断哪些对象还存活,哪些已经死去去.判断对象存活的方法,有如下几种: 引用计数法 每个对象有一个引用计数器,每当有一个地方引用了它计数+1:引用失效计数器-1:当引用计数为0时,说明这个对象在…
一.判断对象是否可进行回收 1.引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象就是不可能再被使用的.但是主流的Java虚拟机里面没有选用引用计数算法来管理内存,最主要的原因是它很难解决对象之间相互循环引用的问题.代码示例如下: public class JVMTest { private JVMTest jvmTest = null; public static void main(String[] arg…
引子:       类加载器(classloader)是独立于虚拟机之外,可以独立实现的代码模块.     OSGi使用了类加载器的这一特点实现其热插拔的特性       Java同C++等语言不通,其连接操作不是在编译期间进行的,而是在程序运行期间进行的,这也就为java的动态扩展的语言特性提供了基础.   首先介绍下虚拟机的类加载机制:     类加载的时机:           类被从加载到虚拟机内存开始,到卸出内存为止,整个生命周期包括了以下七个过程:           加载 - 验证…
首先需要澄清的是,垃圾收集(GC)的历史远比Java要久远,当我们意识到手动管理内存所带来的麻烦时,懒惰的天性推动先驱们寻找更为简单.易用.关键是傻瓜式的内存管理技术.GC技术起源于1960年诞生于MIT的Lisp语言,由此可见越聪明的人越懒惰.           最近有一种想法:程序开发,程序设计从本质上来讲是个哲学问题,虽然我们要解决的问题是现实在程序世界中的投射,那么问题本身就应该在现实世界中有相应的解决,而且我们也一直在模拟现实世界,由过程式,面向对象以及函数式编程以及我们下面所要看到…
说起GC,我们要思考的主要有三件事 哪些内存需要回收 那些已经“死去”的对象,那么哪些对象“死”,哪些对象“活”呢,有个简单的办法 引用计数法,但是没法解决循环依赖问题 所以Java虚拟机采用的是可达性分析算法 这个算法通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,如果对象无法被搜到,那么这些对象会被标记为要清除的对象. 那么“GC Roots”又是什么?“GC Roots”主要有以下几种 活跃栈帧中的指向GC堆的引用,就是方法运行时的临时变量,引用参数 被加载的J…
Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这三个区域的内存分配和回收都具有确定性.垃圾回收重点关注的是堆和方法区部分的内存. 常用的垃圾回收算法有: (1).引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器都为0的对象就是不再被使用的,垃…
Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这三个区域的内存分配和回收都具有确定性.垃圾回收重点关注的是堆和方法区部分的内存. 常用的垃圾回收算法有: (1).引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器都为0的对象就是不再被使用的,垃…
说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物.事实上,GC的历史远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言.当List还在胚胎时期时,人们就在思考GC需要完成的3件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 虽然目前动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,但只有了其内在,才能让我们写好每一句代码.接下来就以上这三个问题逐一揭晓. 哪些内存…
Java一个重要的优势就是通过垃圾管理器GC (Garbage Collection)自动管理和回收内存,程序员无需通过调用方法来释放内存.也因此很好多的程序员可能会认为Java程序不会出现内存泄漏的问题,这种想法是不对的,当我们对内存使用不当的时候仍然可能会出现内存泄漏,并且问题相对与c++来说更隐秘,问题的根源排查起来也比较困难.不过,当我们了解了Java虚拟机内存区域,Java垃圾收集器之后,对于解决内存泄漏的问题也就不是什么困难的事情了. 相关阅读 1.深入理解java虚拟机之java内…
垃圾收集器与内存分配策略 详解 3.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第三章 ,为了整理思路,简单记录一下,方便后期查阅. 3.2 对象已死吗 在垃圾收集器进行回收前,第一件事就是确定这些对象哪些还存活,哪些已经死去. 3.2.1 引用计数算法 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1:当引用失效时,计数器减1:其中计数器为0的对象是不可能再被使用的已死对象. 当两个对象相互引用时,这两个对象就不会被回收 引用计数算法,不被主流虚拟机采用,主要原…
堆内存使用分析,GC 日志解读 重要的东东 在Java中,对象实例都是在堆上创建.一些类信息,常量,静态变量等存储在方法区.堆和方法区都是线程共享的. GC机制是由JVM提供,用来清理需要清除的对象,回收堆内存. GC机制将Java程序员从内存管理中解放了出来,可以更关注于业务逻辑. 在Java中,GC是由一个被称为垃圾回收器的守护线程执行的. 在从内存回收一个对象之前会调用对象的finalize()方法. 作为一个Java开发者不能强制JVM执行GC:GC的触发由JVM依据堆内存的大小来决定.…
第三章 垃圾收集器与内存分配策略 3.1 概述 哪些内存需要回收 何时回收 如何回收 程序计数器.虚拟机栈.本地方法栈3个区域随线程而生灭. java堆和方法区的内存需要回收.   3.2 对象已死吗   什么时候回收内存?   3.2.1 引用计数法 给对象中添加一个引用计数器,有地方引用时,计数器加1:当引用失效时,计数器减1.任何时刻计数器为0时的对象就是不可能再被使用的了. 存在问题:对象间的循环引用.  虚拟机不是通过这种方法判断对象是否存活.   3.2.2 可达性分析算法 通过一系…
目录 3.2 对象已死吗 判断一个对象是否可被回收 引用类型 finalize() 回收方法区 3.3. 垃圾收集算法 1.Mark-Sweep(标记-清除)算法 2.Copying(复制)算法 3.Mark-Compact(标记-整理)算法 4.Generational Collection(分代收集)算法 3.5 垃圾收集器 1.Serial 2.ParNew 3.Parallel Scavenge 4.Serial Old 5.Parallel Old 6.CMS 7.G1 3.6 内存分…