golang GC(一 原理)

golang中的gc采用三色标记法。在讲三色标记法之前,先了解一下Mark and Sweep算法,因为Mark and Sweep算法是三个标记法的一个改进版。

Mark and Sweep算法: 停止运行程序,遍历所有被引用的变量,被引用的对象被标记为“被引用”,没有被标记的进行回收。内存单元并不会立刻回收对象,而是将其标记为“不可达”状态。直到到达某个阈值或者到达某个时间间隔后,对其进行垃圾回收。算法分为两部分:标记(Mark)和清理(Sweep)。挂起程序,对所有存活的内存单元进行扫描,标记,确定哪些可以清除。优点是解决了相互引用的缺点,不足是会停止应用程序,当内存单元变量过多时,扫描清除会花很长时间,甚至几百毫秒。

三色标记法:属于标记清除法的一个改进版。起初所有内存对象都在白色的,从根出发标记所有的对象,标记为灰色,并放入一个队列。然后再将灰色队列中的对象取出,将其引用对象标记为黑色。重复此步骤,待灰色对象队列为空时,所有白色对象既为垃圾。最后白色区域内存对象被释放,黑色区域标记为白色,等待下一阶段GC再次扫描。

三色标记法触发有两个条件:第一个是阀值,就是内存扩大一倍时启动GC。第二个是每隔两分钟GC一次。

三色标记法的具体过程

1、GC开始的时候stop the world。对内存中的对象进行扫描。扫描完毕后,start the world。程序继续运行,GC同时开始标记。

2、将线程(goroutine)直接引用的对象标记为灰色,将灰色内存对象标记为黑色。同时将灰色内存对象引用的对象标记为灰色。

3、反复第2步直到灰色区域为空。此时只有黑色和白色区域了。

4、stop the world, again! 利用写屏障机制,将GC扫描时新创建的对象一律标记为灰色,然后变成黑色。

5、将内存对象被标记为白色的进行释放sweep。

6、剩下的内存全部标记为白色,以便下一次GC使用。

如何优化GC

写代码时,如果要考虑GC对性能的影响,那么要避免要用string+操作,改用var buf bytes.Buffer,用buf.WriteString("xxxx")操作。因为没有string+操作都会生成一个新的string,产生多余的内存碎片。还有就是尽量复用小对象,局部变量需要尽量少声名,多个小对象可以放到一个结构体中,这样方便GC扫描。

原文地址:https://www.cnblogs.com/howo/p/11027428.html

时间: 2024-11-04 09:30:47

golang GC(一 原理)的相关文章

JVM 的 工作原理,层次结构 以及 GC工作原理

JVM Java 虚拟机 Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.JVM实现了Java语言最重要的特征:即平台无关性.原理:编译后的 Java 程序指令并不直接在硬件系统的 CPU 上执行,而是由 JVM 执行.JVM屏蔽了与具体平台相关的信息,使Java语言编译程序只需要生成在JVM上运行的目标字节码(.class),就可以在多种平台上不加修改地运行.Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行.因此实

golang gc

步骤: 暂停所有任务执行 启动mark(mark这部分还是要把原程序停下来的 mark完成后就马上就重新启动被暂停的任务 sweep任务和普通协程任务一样并行 和其他任务一起执行 如果运行在多核处理器上,go会试图将gc任务放到单独的核心上运行而尽量不影响业务代码的执行 go team自己的说法是减少了50%-70%的暂停时间 优化目的: 基本算法: 清扫+回收 Golang gc优化的核心就是尽量使得STW(Stop The World)的时间越来越短 原文地址:https://www.cnb

优秀Java程序员必须了解的GC工作原理

一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率 ,才能提高整个应用程序的性能. 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率 ,才能提高整个应用程序的性能.本篇文章首先简单介绍GC的工作原理之后,然后再对GC的几个关键问题进行

Java GC的原理

Java GC(garbage collec,垃圾收集,回收) GC是对JVM中的内存进行标记和回收,Sun公司的JDK用的虚拟机都是HotSpot 对象化的实例是放在heap堆内存中的,这里讲的分代收集也是指对堆内存的回收 GC的分代收集分为:年轻代.老年代.永久代.(方法区是被当做永久代的,不过JDK1.6后将被取消掉了) 年轻代(Young Generation).年老代(Old Generation).永久代(Permanent Generation,也就是方法区) 1.年轻代的GC(存

【JAVASE】JAVA内存模式和类加载机制,GC简单原理

先介绍一下类加载的过程: 我们编写的是源码文件java,通过jdk bin下面的javac工具,编译为class字节码文件,然后通过bin下面的java命令调用jvm解析class文件运行. java实际运行的时候依靠的是字节码,之所以说java跨平台就是因为jvm能够跨平台,只要有jvm的地方,java都可以运行. JVM装在Class文件的过程: 装载,准备,解析. JVM通过类加载器完成类的装载过程,具体如图所示 1.先通过 启动类加载器,完成基础类的加载 lib下面的  rt.jar(c

Java GC工作原理以及Minor GC、Major GC、Full GC简单总结

名词解释: GC:垃圾收集器 Minor GC:新生代GC,指发生在新生代的垃圾收集动作,所有的Minor GC都会触发全世界的暂停(stop-the-world),停止应用程序的线程,不过这个过程非常短暂. Major GC/Full GC:老年代GC,指发生在老年代的GC. JVM:Java Virtual Machine(Java虚拟机)的缩写. 正文: >堆 众所周知,所有通过new创建的对象的内存都在堆中分配,堆被划分为新生代和老年代,新生代又被进一步划分为Eden和Survivor区

golang gc 优化思路以及实例分析

一个即将上线的go 写的高频服务,压测的时候发现 gc 特别高,高到10%-15% 左右了,本文记录下优化 gc 的过程和和思路.线上环境1.10. 首先,查看gc 是否有异常,我们可以使用 gctrace 跟踪实时的gc .执行下面命令可以看到gc 的实时信息. GODEBUG=gctrace=1 go run cmd/agent_bin.go 输出结果如下: gc 45 @37.801s 11%: 0.19+627+0.29 ms clock, 0.38+424/621/0+0.59 ms

golang 垃圾回收 gc

http://ruizeng.net/golang-gc-internals/ 摘要 在实际使用go语言的过程中,碰到了一些看似奇怪的内存占用现象,于是决定对go语言的垃圾回收模型进行一些研究.本文对研究的结果进行一下总结. 什么是垃圾回收? 曾几何时,内存管理是程序员开发应用的一大难题.传统的系统级编程语言(主要指C/C++)中,程序员必须对内存小心的进行管理操作,控制内存的申请及释放.稍有不慎,就可能产生内存泄露问题,这种问题不易发现并且难以定位,一直成为困扰开发者的噩梦.如何解决这个头疼的

Java 内存模型及GC原理

转至:http://blog.csdn.net/ithomer/article/details/6252552 一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序的性能. 本文将从JVM内存模型.GC工作原理,以及GC的几个关键问题进行探讨,从GC角度提高Java程序的性能. 一.Java内存模型 按照官方的说法:Java 虚拟机具