Sweep

[总结]-第三章 垃圾收集器与内存分配策略

梦想的初衷 提交于 2020-04-10 00:54:47
[总结]-第三章 垃圾收集器与内存分配策略 一、知识点 1、对象是否存活的判定 引用计数法 可达性分析(GC Roots) 判定对象死亡需要经过2次标记: 第一次标记:可达性分析后没有与GC Roots相连接的引用链。 第二次标记:GC对F-Queue中的对象进行标记(低优先级的Finalizer线程会去执行F-Queue中对象的finalize()方法) 2、引用分类 强引用(Strong Reference) 主要强引用还在,则垃圾收集器不会回收被引用的对象。 软引用(Soft Reference) 内存不足即将OOM时,回收。比如:缓存数据。 弱引用(Weak Reference) 只要gc就回收。 虚引用(Phantom Reference) 可以判断被关联的对象是否被GC 3、finalize( ) 任何一个对象的finalize()方法都只会被系统自动调用一次。(注意是对象,并不是类); finalize()如果耗时过长,GC并不会等待。它只是通知另一个线程(Finalizer)去执行而已; 知道即可,不建议使用; 4、垃圾收集算法 引用计数器 优点:实时性,只要对象的引用计数器为0,立刻回收; 缺点:互相引用就永远无法去除。 标记、清除 (一般在老年代适用) 标记:找到所有可访问的对象,做个标记; 清除:遍历堆,把未标记的对象清除; 缺点:1、标记、清除效率都低;2

图文并茂,万字详解,带你掌握 JVM 垃圾回收!

☆樱花仙子☆ 提交于 2020-03-19 08:43:12
3 月,跳不动了?>>> 垃圾回收( Garbage Collection 以下简称 GC)诞生于1960年 MIT 的 Lisp 语言,有半个多世纪的历史。 在Java 中,JVM 会对内存进行自动分配与回收,其中 GC 的主要作用就是清楚不再使用的对象,自动释放内存。 GC 相关的研究者们主要是思考这3件事情。 哪些内存需要回收? 什么时候回收? 如何回收? 本文也大致按照这个思路,为大家描述垃圾回收的相关知识。因为会有很多内存区域相关的知识,希望读者先学习完《 精美图文带你掌握 JVM 内存布局 》再来阅读本文。 本文的主要内容如下(建议大家在阅读和学习的时候,也大致按照以下的思路来思考和学习): 哪些内存需要回收?即GC 发生的内存区域? 如何判断这个对象需要回收?即GC 的存活标准? 这里又能够引出以下的知识概念: 引用计数法 可达性分析法 引用的种类和特点、区别 (强引用、软引用、弱引用、虚引用) 延伸知识:(WeakHashMap) (引用队列) 有了对象的存活标准之后,我们就需要知道GC 的相关算法(思想) 标记-清除(Mark-Sweep)算法 复制(Copying)算法 标记-整理(Mark-Compact)算法 在下一步学习之前,还需要知道一些GC的术语,防止对一些概念描述出现混淆,知道了算法之后,自然而然我们到了JVM中对这些算法的实现和应用

Linux从程序到进程

99封情书 提交于 2020-03-15 07:24:16
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 整个教程 中已经不时的出现一些内存管理和垃圾回收的相关知识。这里进行一个小小的总结。 Java是在JVM所虚拟出的内存环境中运行的。内存分为栈(stack)和堆(heap)两部分。我们将分别考察这两个区域。 栈 栈的基本概念参考 纸上谈兵: 栈 (stack) 。许多语言利用栈数据结构来记录函数调用的次序和相关变量(参考 Linux从程序到进程 )。 在Java中,JVM中的栈记录了线程的方法调用。每个线程拥有一个栈。在某个线程的运行过程中,如果有新的方法调用,那么该线程对应的栈就会增加一个存储单元,即帧(frame)。在frame中,保存有该方法调用的参数、局部变量和返回地址。 调用栈 Java的参数和局部变量只能是 基本类型 的变量(比如int),或者对象的 引用 (reference)。因此,在栈中,只保存有基本类型的变量和对象引用。 引用所指向的对象保存在堆中。(引用可能为Null值,即不指向任何对象) 引用与对象 当被调用方法运行结束时,该方法对应的帧将被删除,参数和局部变量所占据的空间也随之释放。线程回到原方法,继续执行。当所有的栈都清空时,程序也随之运行结束。 堆 如上所述,栈(stack)可以自己照顾自己。但堆必须要小心对待

JVM之几种垃圾收集器简单介绍

微笑、不失礼 提交于 2020-02-28 16:04:33
本文中的垃圾收集器研究背景为:HotSpot+JDK1.7 一、垃圾收集器概述 如上图所示,垃圾回收算法一共有7个,3个属于年轻代、三个属于年老代,G1属于横跨年轻代和年老代的算法。 JVM会从年轻代和年老代各选出一个算法进行组合, 连线 表示哪些算法可以组合使用 二、各个垃圾收集器说明 1、Serial(年轻代) 年轻代收集器,可以和Serial Old、CMS组合使用 采用复制算法 使用单线程进行垃圾回收,回收时会导致Stop The World,用户进程停止 client模式年轻代默认算法 GC日志关键字: DefNew(Default New Generation) 图示(Serial+Serial Old) 2、ParNew (年轻代) 新生代收集器,可以和Serial Old、CMS组合使用 采用复制算法 使用多线程进行垃圾回收,回收时会导致Stop The World,其它策略和Serial一样 server模式年轻代默认算法 使用-XX:ParallelGCthreads参数来限制垃圾回收的线程数 GC日志关键字: ParNew(Parallel New Generation) 图示(ParNew + Serail Old) 3、Paralle Scavenge (年轻代) 新生代收集器,可以和Serial Old、Parallel组合使用,不能和CMS组合使用

on-line

限于喜欢 提交于 2020-02-26 23:03:18
-XX:+UseCompressedOops -XX:+TieredCompilation -server -Xms2048m -Xmx2048m -XX:MaxPermSize=384m -Xmn768m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+UseCMSInitiatingOccupancyOnly -XX:+ScavengeBeforeFullGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=9 -XX:CMSInitiatingOccupancyFraction=60 -XX:+CMSClassUnloadingEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-ReduceInitialCardMarks -XX:+CMSPermGenSweepingEnabled -XX:CMSInitiatingPermOccupancyFraction=70 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:

GC 垃圾回收

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-26 14:58:38
1 判断对象是否是垃圾算法 1.1 引用计数算法 优点:执行效率高,程序执行受影响较小 缺点:无法检测出循环引用 情况,导致内存泄漏 1.2 可达性分析算法 通过判断对象的引用链是否可达来决定对象是否可以被回收 1.3 可作为GC Root的对象 虚拟机栈中引用的对象(栈针重点本地变量表) 方法区中的常量引用对象 方法区中的类静态属性引用的对象 本地方法栈中JNI(Native方法)的引用对象 活跃线程的应用对象 2 垃圾回收算法 2.1 标记-清除算法(Mark and Sweep) 标记:从根集合进行扫描,对存活的对象进行标记 清除:对堆内存从头到尾进行线性遍历,回收不可达对象内存 2.2 复制算法(Copying) 解决碎片化问题 顺序分配内存,简单高效 适用于对象存活率低的场景 2.3 标记-整理算法(Compacting) 标记:从根集合进行扫描,对存活的对象进行标记 清除:移动所有存活对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收 总结: 避免内存的不连续性 不用设置两块内存互换 适用于存活率高的场景 2.4 分代收集算法(Generational Collector) 垃圾回收算法的组合拳 按照对象生命周期的不同划分区域以采用不同的垃圾回收算法 目的:提高JVM的回收效率 3 彩蛋 3.1 JVM运行模式 Server Client 3.2

JVM有关垃圾回收机制的配置

笑着哭i 提交于 2020-02-26 13:04:47
JVM的垃圾回收机制有下面几种: 年轻态几种垃圾收集方式: Serial (复制) 是一种stop-the-world(导致应用全部暂停,僵死一会儿), 使用单个GC线程进行复制收集 将幸存对象从 Eden复制到幸存 Survivor空间,并且在幸存Survivor空间之间复制,直到它决定这些对象已经足够长了,在某个点一次性将它们复制到旧生代old generation. Parallel Scavenge (PS Scavenge)是一种stop-the-world, 使用多个GC线程实现复制收集。如同上面复制收集一样,但是它是并行使用多个线程。 ParNew是一种stop-the-world, 使用多个GC线程实现的复制收集,区别于"Parallel Scavenge"在于它与CMS可搭配使用,它也是并行使用多个线程,内部有一个回调功能允许旧生代操作它收集的对象。 旧生代几种垃圾收集方式: Serial Old (MarkSweepCompact) 是一种stop-the-world, 使用单个线程进行mark-sweep-compact(标志-清扫-压缩) 收集。 Parallel Old (PS MarkSweep) 是一种使用多个GC线程压缩收集。 ConcurrentMarkSweep (CMS) 是最并行,低暂停的收集器

垃圾回收器PS MarkSweep和serial old使用算法异同

前提是你 提交于 2020-02-26 12:32:37
[讨论] 关于GC参数的问题 ParallelScavenge(PS)的young collector就如其名字所示,是并行的拷贝式收集器。本来这个young collector就是“Parallel Scavenge”所指,但因为它不兼容原本的分代式GC框架,为了凸显出它是不同的,所以它的young collector带上了PS前缀,全名变成PS Scavenge。对应的,它的old collector的名字也带上了PS前缀,叫做PS MarkSweep。 这个PS MarkSweep默认的实现实际上是一层皮,它底下真正做mark-sweep-compact工作的代码是跟分代式GC框架里的serial old(这个collector名字叫做MarkSweepCompact)是共用同一份代码的。也就是说实际上PS MarkSweep与MarkSweepCompact在HotSpot VM里是同一个collector实现,包了两张不同的皮;这个collector是串行的。 链接:https://hllvm-group.iteye.com/group/topic/27629 深入理解java虚拟机 在Parallel Scavenge收集器架构中本身有PS MarkSweep收集器来进行老年代收集,但由于PS MarkSweep与Serial Old实现非常接近

垃圾回收算法和垃圾收集器

99封情书 提交于 2020-02-26 07:36:54
垃圾回收常见算法 1.引用计数法(Reference Counting) 比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个应用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。 2.复制(Copying) 此算法把内存空间划为两个相等区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中,此算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还可以进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍的内存空间。 绿色:已被使用,但还存活的内存空间。比如new了一个对象,这个对象引用了其它方法,或持有其它对象,它持有的对象正在执行某个方法。 蓝色:正在运行中的内存空间。比如某个对象在此时正在执行某个方法。 灰色:待回收的垃圾内存。 白色:未使用的内存空间 橙色:一大块空的内存区域。比如survivor区域的,from区域和to区域。 3.标记-清除法(Mark-Sweep) 最核心,最基础的内存回收算法,后面许多算法,都是基于这个算法之上延伸的。 此算法执行分两阶段。第一阶段从引用根节点(GC ROOTS)开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。 此算法需要暂停整个应用( stop the world )

垃圾回收器(待完善)

放肆的年华 提交于 2020-02-25 23:26:18
垃圾回收器有: 年轻代:Serial、ParNew、Parallel Scavenge 老年代:Serial Old、Parallel Old、CMS 年轻代与老年代:G1 年轻代 Serial 收集器 单线程的收集器,执行的时候会发生 STW(Stop the world),使用标记复制算法。 ParNew 收集器 Serial 收集器的多线程版本,同样会发生 STW(Stop the world),使用标记复制算法。 Parallel Scavenge 收集器 多线程并行的收集器,使用标记复制算法。此收集器更关注的是吞吐量(运行用户代码时间/总耗时时间),其中提供了两个参数,一个是最大垃圾收集停顿时间(-XX:MaxGCPauseMillis),另一个是吞吐量大小(-XX:GCTimeRatio)。 老年代 Serial Old 收集器 Serial 收集器的老年代版本。 Paralled Old 收集器 Serial Old 收集器的多线程版本。 CMS 收集器 全称:Concurrent Mark Sweep,是并发多线程的收集器,使用标记清理算法。整个过程有四个步骤:初始标记、并发标记、重新标记、并发清除。 初始标记:将 GC Roots 的下一级对象进行标记,会发生 STW(Stop the world)。 并发标记:从 GC Roots 继续向下标记,所有关联的对象