Sweep

JVM--JVM经典垃圾收集器整理(Serial收集器、ParNew收集器、Parallel Scavenge收集器、Garbage First收集器、ZGC)

99封情书 提交于 2020-02-25 16:06:26
echo编辑整理。欢迎添加echo微信(微信号:t2421499075)交流学习。该文章不支持转载,主要内容来自读书笔记和网络博客,以及视频学习整理。 参考资料列表: 1、深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) 2、Serial收集器和ParNew收集器: https://blog.csdn.net/wxy941011/article/details/80653738 注:本文说的垃圾收集器基本都是JDK1.7以后的垃圾收集器,不讨论JDK1.7以前的。 经典垃圾收集器盘点 1、Serial收集器 2、ParNew收集器 3、Parallel Scavenge收集器 4、Serial Old收集器 5、Parallel Old收集器 6、CMS收集器 7、Garbage First收集器 8、Shenandoah收集器 9、ZGC收集器 10、Epsilon收集器 Serial收集器 Serial收集器是最基础、历史最悠久的收集器,曾经(在JDK1.3.1之前)是HotSpot虚拟机新生代收集器的唯一选择,时至今日,垃圾收集器的不断改进,不断出新,Serial依然在我们的垃圾收集器的选项里面。 Serial收集器运行示意图 Serial收集器的特点: 优点:简单高效,拥有很高的单线程收集效率 缺点:收集过程需要暂停所有线程 使用算法:复制算法 适用范围:新生代

The Skyline Problem

倾然丶 夕夏残阳落幕 提交于 2020-01-10 19:14:33
2020-01-10 17:51:05 问题描述 : 问题求解 : 本题是经典的sweep line问题。 对于sweep line问题我们需要考虑的只有两点: 1. 延水平方向 / 时间方向 :时间队列 event queue ,一般来说是一个优先队列; 2. 延垂直方向 : sweep line status ,即当前的扫描线的状态,一般会将交点按照顺序排序; 对于本题来说,sweep line status可以使用一个multi set来进行维护,当然由于在Java中没有multi set,因此需要使用TreeMap来模拟。 event queue的当然是使用优先队列,问题是如何进行排序,这个才是本题的核心难点。 这里给出结论: 大方向是按照x轴排序,如果x轴相等那么按照height排序; 如果x轴相等,优先判断是否是左端点,如果是左端点,那么优先入队; 如果同时是右端点,那么需要反序入队,就是height小的反而需要排在前面。 public List<List<Integer>> getSkyline(int[][] buildings) { List<List<Integer>> res = new ArrayList<>(); // 对于同x轴,优先将左端点入队列 // 如果同是右端点,则要反序,小的先入队列 // 其余按照正常的height顺序排列即可

Go语言最新面试题及其解析(一)

久未见 提交于 2020-01-07 03:27:55
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 点击这里,查看 剩余3道最新面试题及其解析 简介: 了解最新的Go语言面试题型,让面试不再是难事。 1.select是随机的还是顺序的 ? select会随机选择一个可用通道做收发操作 2.Go语言局部变量分配在栈还是堆? Go语言编译器会自动决定把一个变量放在栈还是放在堆,编译器会做逃逸分析,当发现变量的作用域没有跑出函数范围,就可以在栈上,反之则必须分配在堆。 查看资料 3.简述一下你对Go垃圾回收机制的理解? v1.1 STW v1.3 Mark STW, Sweep 并行 v1.5 三色标记法 v1.8 hybrid write barrier(混合写屏障:优化STW) Golang垃圾回收剖析 关键字:存储 JSON 监控 Java 编译器 测试技术 Go API 调度 数据格式 来源: oschina 链接: https://my.oschina.net/u/4431452/blog/3152670

由浅入深了解GC原理

故事扮演 提交于 2020-01-07 02:51:24
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> GC ( Garbage Collection )很大程度上帮助 Java 程序员解决了内存释放的问题,有了 GC ,就不需要再手动的去控制内存的释放。 在阅读之前需要了解的相关概念: Java 堆内存分为新生代和老年代,新生代中又分为 1 个 Eden 区域 和 2 个 Survivor 区域。 一、什么是GC(Garbage Collection) GC 垃圾收集, Java 提供的 GC 可以自动监测对象是否超过作用域从而达到自动回收内存的目的。 每个程序员都遇到过内存溢出的情况,程序运行时,内存空间是有限的,那么如何及时的把不再使用的对象清除将内存释放出来,这就是GC要做的事。 需要 GC 的内存区域 JVM 中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于 JAVA 堆和方法区中,在程序运行期间,这部分内存的分配和使用都是动态的。 注意: 对于 Java8 , HotSpots 取消了永久代,那么是不是也就没有方法区了呢?当然不是,方法区是一个规范,规范没变,它就一直在。那么取代永久代的就是元空间。它可永久代有什么不同的?存储位置不同,永久代物理是是堆的一部分,和新生代,老年代地址是连续的

7种JVM垃圾收集器特点,优劣势、及使用场景

蓝咒 提交于 2019-12-14 16:29:43
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 常见的垃圾收集器有3类: 1.新生代的收集器包括: Serial PraNew Parallel Scavenge 2.老年代的收集器包括: Serial Old Parallel Old CMS 3.回收整个Java堆(新生代和老年代) G1收集器 今天我们详细谈谈以上7种垃圾收集器的优劣势和使用场景。 新生代垃圾收集器 1.Serial串行收集器-复制算法 Serial收集器是新生代单线程收集器,优点是简单高效,算是最基本、发展历史最悠久的收集器。它在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集完成。 Serial收集器依然是虚拟机运行在Client模式下默认新生代收集器,对于运行在Client模式下的虚拟机来说是一个很好的选择。 2.ParNew收集器-复制算法 ParNew收集器是新生代并行收集器,其实就是Serial收集器的多线程版本。 除了使用多线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参数、收集算法、Stop The Worl、对象分配规则、回收策略等都与Serial 收集器完全一样。 3.Parallel Scavenge(并行回收)收集器-复制算法 Parallel Scavenge收集器是新生代并行收集器,追求高吞吐量,高效利用 CPU。

一些长时间GC停顿问题的排查及解决办法

笑着哭i 提交于 2019-12-04 17:39:04
对于许多企业级应用,尤其是OLTP应用来说,长暂停很可能导致服务超时,而对这些运行在JVM上的应用来说, 垃圾回收(GC)可能是长暂停最主要的原因 。本文将描述一些可能碰到GC长暂停的不同场景,以及说明我们如何排查和解决这些GC停顿的问题。 下面是一些应用在运行时,可能导致GC长暂停的不同场景。 1. 碎片化 这个绝对要排在第一位。因为,正是因为碎片化问题--CMS最致命的缺陷,导致这个统治了OLAP系统十多年的垃圾回收器直接退出历史舞台(CMS已经是 deprecated ,未来版本会被移除,请珍惜那些配置了CMS的JVM吧),面对G1以及最新的ZGC,天生残(碎)缺(片)的CMS毫无还手之力。 对于CMS,由于老年代的碎片化问题,在YGC时可能碰到晋升失败( promotion failures ,即使老年代还有足够多有效的空间,但是仍然可能导致分配失败,因为 没有足够连续的空间 ),从而触发 Concurrent Mode Failure ,发生会完全STW的FullGC。FullGC相比CMS这种并发模式的GC需要更长的停顿时间才能完成垃圾回收工作,这绝对是Java应用最大的灾难之一。 为什么CMS场景下会有碎片化问题?由于CMS在老年代回收时,采用的是标记清理(Mark-Sweep)算法,它在垃圾回收时并不会压缩堆,日积月累,导致老年代的碎片化问题会 越来越严重

JavaScript深入浅出第3课:什么是垃圾回收算法?

空扰寡人 提交于 2019-12-04 16:47:24
摘要: JS是如何回收内存的? 《 JavaScript深入浅出 》系列 : JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼? JavaScript深入浅出第2课:函数是一等公民是什么意思呢? JavaScript深入浅出第3课:什么是垃圾回收算法? 最近垃圾回收这个话题非常火,大家不能随随便便的扔垃圾了,还得先分类,这样方便对垃圾进行回收再利用。 其实,对于写代码来说,也有 垃圾回收(garbage collection) 这个问题,这里所说的垃圾,指的是 程序中不再需要的内存空间 ,垃圾回收指的是回收这些不再需要的内存空间,让程序可以重新利用这些释放的内存空间。 手动管理内存 对于C这种底层语言来说,我们可以使用malloc()函数分配内存空间,当所分配的内存不再需要的时候,可以使用free()函数来释放内存空间。 #include <stdio.h> #include <stdlib.h> #define TRUE 1 int main () { int *p, i, n, sum; while (TRUE) { printf ("请输入数组长度: "); scanf ("%d", &n); p = (int *) malloc (n * sizeof (int)); // 分配内存空间 sum = 0; for (i = 0; i < n; ++i)

JVM 的垃圾回收器,你真的搞懂这些了吗?

ⅰ亾dé卋堺 提交于 2019-12-04 15:36:49
JVM的GC经过多年的发展,大家对 Minor GC、 major GC的理解并不完全一致,所以我不打算在本文中使用这个概念。我把GC大概分为一下4类: Young GC:只是负责回收年轻代对象的GC; Old GC:只是负责回收老年代对象的GC; Full GC:回收整个堆的对象,包括年轻代、老年代、持久带; Mixed GC: 回收年轻代和部分老年代的GC (G1); 因为笔者目前使用G1还是比较少的,所以本文不打算将G1。 垃圾回收器算法 目前主流垃圾回收器都采用的是可达性分析算法来判断对象是否已经存活,不使用引用计数算法判断对象时候存活的原因在于该算法很难解决相互引用的问题。 标记-清除算法( Mark-Sweep ) 标记-清除算法由标记阶段和清除阶段构成。标记阶段是把所有活着的对象都做上标记的阶段;清除阶段是把那些没有标记的对象,也就是非活动对象回收的阶段。通过这两个阶段,就可以令不能利用的内存空间重新得到利用。 从 标记-清除算法我们可以看出, 该算法不涉及对象移动 ,但是 可能会产生内存碎片化 问题。空间碎片太高可能会导致程序运行时需要分配较大内存时候,无法找到足够的连续内存,需要其他垃圾回收帮助回收内存。 复制算法(Copying) 复制算法 内存空间分为两块区域: From、to ,每次只使用其中一块

GC策略选择

橙三吉。 提交于 2019-12-04 13:57:55
GC 以栈或寄存器中的引用【GC Roots】为起点 ,可以找到堆中的对象,又从这些对象找到对堆中其他对象的引用,这种引用逐步扩展,最终以null引用或者基本类型结束,这样就形成了一颗以Java栈中引用所对应的对象为根节点的一颗对象树,如果栈中有多个引用,则最终会形成多颗对象树。 在这些对象树上的对象,都是当前系统运行所需要的对象,不能被垃圾回收。而其他剩余对象,则可以视为无法被引用到的对象,可以被当做垃圾进行回收。因此, 垃圾回收的起点是一些根对象(java栈, 静态变量, 寄存器…) 。而最简单的Java栈就是Java程序执行的main函数。 这即是“ 标记-清除 ”的回收方式。 在Java语言中, GC Roots 包括: 虚拟机栈中引用的对象。 方法区中类静态属性实体引用的对象。 方法区中常量引用的对象。 本地方法栈中JNI引用的对象。 Minor GC 一般情况下, 当新对象生成且在Eden申请空间失败时,就会触发Minor GC 。对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区;然后整理Survivor的两个区。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以 Eden区的GC会频繁进行 。因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。 虚拟机给每个对象定义了一个对象年龄(Age

GC策略选择

旧城冷巷雨未停 提交于 2019-12-04 13:55:47
GC 以栈或寄存器中的引用【GC Roots】为起点 ,可以找到堆中的对象,又从这些对象找到对堆中其他对象的引用,这种引用逐步扩展,最终以null引用或者基本类型结束,这样就形成了一颗以Java栈中引用所对应的对象为根节点的一颗对象树,如果栈中有多个引用,则最终会形成多颗对象树。 在这些对象树上的对象,都是当前系统运行所需要的对象,不能被垃圾回收。而其他剩余对象,则可以视为无法被引用到的对象,可以被当做垃圾进行回收。因此, 垃圾回收的起点是一些根对象(java栈, 静态变量, 寄存器…) 。而最简单的Java栈就是Java程序执行的main函数。 这即是“ 标记-清除 ”的回收方式。 在Java语言中, GC Roots 包括: 虚拟机栈中引用的对象。 方法区中类静态属性实体引用的对象。 方法区中常量引用的对象。 本地方法栈中JNI引用的对象。 Minor GC 一般情况下, 当新对象生成且在Eden申请空间失败时,就会触发Minor GC 。对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区;然后整理Survivor的两个区。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以 Eden区的GC会频繁进行 。因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。 虚拟机给每个对象定义了一个对象年龄(Age