JVM垃圾回收之CMS收集器】的更多相关文章

从前文JVM垃圾回收几种常见算法和常见收集器我们知道,CMS是老年代垃圾收集器.CMS 收集器主要关注系统停顿时间.CMS 是 Concurrent Mark Sweep 的缩写,意为并发标记清除,从名称上可以得知,它使用的是标记-清除算法,同时它又是一个使用多线程并发回收的垃圾收集器.它可以与Serial收集器和parNew收集器搭配使用.     CMS工作时,主要步骤有:初始标记.并发标记.重新标记.并发清除和并发重置.其中初始标记和重新标记是独占系统资源的,而并发标记.并发清除和并发重置…
摘自<深入理解Java虚拟机> 一.什么是: GC算法是 方法论,那么垃圾收集器就是具体的 实现. 二.四种 垃圾回收算法 1.标记-清除算法:最基础的收集算法:不足有两点:1标记和清除两个过程效率都不高:2会产生空间碎片: 2.复制算法:实现简单,效率较高:不足是空间利用率底,只得意了一半的空间. HotSpot中新生代主要也是 复制算法,但不是按1:1来划分空间,而是划分为Eden和两个Survivor空间,默认是8:1,也就是新生代能利用 90%空间:当Survivor空间不足时,需要依…
为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的 . 因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象.线程.Socket连接,这 类对象跟业务直接挂钩,因此生命周期比较长.但是还有一些对象,主要是程序运行过程中生成的临时变量,这些对象生命周期会比较短,比如:String对 象,由于其不变类的特性,系统会产生大量的这些对象,有些…
JVM垃圾回收算法(最全) 下面是JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:jvm如何知道那些对象需要回收 ? 目前两种标识算法.三种回收算法.两种清除算法.三种收集器 引用计数法 每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收 这个可以用数据算法中的图形表示,对象A-对象B-对象C…
在Java运行时的几个数据区域中,程序计数器,虚拟机栈,本地方法栈3个区域随着线程而生,随线程而灭,因此这几个区域的内存分配和回收具有确定性,不需要过多考虑垃圾回收问题,因为方法结束或者线程结束时,内存就回收了.但是方法区和堆区不一样,一个接口或者实现类所需要的内存可能不一样,一个方法的多个分支需要的内存也可能不一样,只有程序运行时才能知道创建哪些对象,这部分内存的分配和回收是动态的. 在进行垃圾回收时候,首先需要判断哪些对象需要回收,这就涉及到回收算法的问题. 一.垃圾回收算法 1.标记-清除…
引言 本文主要讲述JVM中几种常见的垃圾回收算法和相关的垃圾回收器,以及常见的和GC相关的性能调优参数. GC Roots 我们先来了解一下在Java中是如何判断一个对象的生死的,有些语言比如Python是采用引用计数来统计的,但是这种做法可能会遇见循环引用的问题,在Java以及C#等语言中是采用GC Roots来解决这个问题.如果一个对象和GC Roots之间没有链接,那么这个对象也可以被视作是一个可回收的对象. Java中可以被作为GC Roots中的对象有: 虚拟机栈中的引用的对象. 方法…
JVM垃圾回收算法 1.标记清除(Mark-Sweep) 原理: 从根集合节点进行扫描,标记出所有的存活对象,最后扫描整个内存空间并清除没有标记的对象(即死亡对象)适用场合: 存活对象较多的情况下比较高效适用于年老代(即旧生代) 缺点: 标记清除算法带来的一个问题是会存在大量的空间碎片,因为回收后的空间是不连续的,这样给大对象分配内存的时候可能会提前触发full gc.   2.复制算法(Copying) 原理: 从根集合节点进行扫描,标记出所有的存活对象,并将这些存活的对象复制到一块儿新的内存…
JVM垃圾回收(GC) 1. 判断对象是否可以被回收 引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收.此方法简单,但无法解决对象相互循环引用的问题. // 循环引用 Node a=new Node(); Node b=new Node(); a.next=b; b.next=a; 可达性分析:从GC Roots开始向下搜索,搜索所走过的路径称为引用链.当一个对象到GC Roots没有任何引用链时,则证明此对象时不可用的,可以被回收. 为了避…
贴个图 Serial收集器 最简单的收集器,单线程,收集器会暂停用户线程,称为"stop the world". ParNew收集器 Serial收集器的多线程版本,其它类似.默认线程数为CPU线程数,通过-XX:ParallelGCThreads=? 可以指定线程数 Parallel Scavenge收集器 复制算法,多线程收集器.与ParNew的区别在于,该收集器关注系统吞吐量(吞吐量=用户运行时间/(用户运行时间+垃圾回收时间)).通过-XX:MaxGCPauseMillis 设…
[概述] 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现.Java 虚拟机规范中对垃圾收集器应该如何实现没有任何规定,因此不同的厂商.不同版本的虚拟机所提供的垃圾处理器都可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器.下图为 HotSpot 虚拟机的垃圾收集器: 上图展示了7种用于不同分代的收集器,其中新生代的收集器有:Serial .ParNew.Parallel Scavenge, 老年代的收集器有:Serial Ol…