go的调度 与 go 的GC

go的调度 与 go 的GC

调度

首先golang的goroutine占用的资源非常小,默认size是2k,goroutine调度的切换也不用到内核层去完成,代价很低,所以go可以创建成千上万个goroutine。对于操作系统而言,go程序是一个用户层程序,对goroutine是不可见的,所以goroutine的调度要靠go自己来实现,也就是go runtime。

经过发展后,现在的Go调度器模型是GPM模型,算法是work stealing算法。

G就是goroutine,M指的是CPU,P是G和M之间的逻辑处理层,用来实现Go调度的伸展性。

对于G而言,它对应的P就是他的CPU,但是从调度角度来看,真正的CPU是M,这个关系有点像线程,进程,操作系统的关系。

Go是使用抢占调度的,go程序启动时,runtime会去启动一个叫sysmon的监控线程,他每20us到10毫秒启动一次,他会检查当前运行情况,比如超过2分钟没有垃圾回收,强制执行,向长时间运行的G发出抢占调度,收回长时间阻塞的P等。

Go的GC

GC算法有几种经典,比如引用计数,标记清扫,标记复制,分代回收,这些GC算法在JavaGC中也有。

Go的GC算法是基于标记GC的一个改进,叫做三色标记算法。

  1. 起初所有对象都是白色的
  2. 从根出发,扫描所有可达对象,标记为灰色,放入待处理队列
  3. 从队列中取出灰色对象,将其引用对象标记为灰色再放入队列,自身标记为灰色
  4. 重复3直到灰色对象为空,这个时候白色对象就是垃圾,回收白色对象。

这个过程有点像树遍历的层次遍历法和图的广度遍历

GC条件

在堆上分配大于32KB的对象时,进行检测,是否此时满足垃圾回收条件。

GC方式

自动检测GC和用户调用GC 监控函数数sysmon。

原文地址:https://www.cnblogs.com/Jun10ng/p/12616268.html

时间: 2024-10-16 15:19:56

go的调度 与 go 的GC的相关文章

Goroutine并发调度模型深度解析之手撸一个协程池

golanggoroutine协程池Groutine Pool高并发 并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题:Go语言作为一个出道以来就自带 『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是值得开发者去探究的,而Go语言中的并发(并行)编程是经由goroutine实现的,goroutine是golang最重要的特性之一,具有使用成本低.消耗资源低.能效高等特点,官方宣称原生goroutine并发成千上万不成问题,于是它也成为Gopher们经常

GO 新开发者要注意的陷阱和常见错误

转自:http://colobu.com/2015/09/07/gotchas-and-common-mistakes-in-go-golang/ 初级 开大括号不能放在单独的一行 未使用的变量 未使用的Imports 简式的变量声明仅可以在函数内部使用 使用简式声明重复声明变量 偶然的变量隐藏Accidental Variable Shadowing 不使用显式类型,无法使用"nil"来初始化变量 使用"nil" Slices and Maps Map的容量 字符

[转]Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误-高级

from : https://levy.at/blog/11 进阶篇 关闭HTTP的响应 level: intermediate 当你使用标准http库发起请求时,你得到一个http的响应变量.如果你不读取响应主体,你依旧需要关闭它.注意对于空的响应你也一定要这么做.对于新的Go开发者而言,这个很容易就会忘掉. 一些新的Go开发者确实尝试关闭响应主体,但他们在错误的地方做. package main import ( "fmt" "net/http" "i

金9银10,分享几个重要的Android面试题

说一下java多态的理解,以及接继承,和接口的理解 于哥在这里只讲多态,其他自己上网体会 对于多态的定义不同类的对象对统一函数做出不同对的响应或者动作.作用主要是消除类之间的耦合性,灵活性比较强,利于代码的编写和修改.尤其在处理大量的运算和操作时,可以灵活地简化,替换或者是修改代码! 三个必要条件1.一个凳子(继承extends)2.重写3.父类引用指向子类对象 for example 测试结果: 测试结果 oKhttp的 原理 1.同步和异步: 1.异步使用了Dispatcher来将存储在 D

JVM运行时数据区划分

Java内存空间 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了JAVA在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳定运行.不同的jvm对于内存的划分方式和管理机制存在着部分差异(对于Hotspot主要指方法区) (图源阿里)JDK8的元数据区+JIT编译产物 就是JDK8以前的方法区 JavaAPI中的Runtime public class Runtime extends Object Every Java

JVM的GC概述

JVM的GC概述 GC即垃圾回收,是指jvm用于释放那些不再使用的对象所占用的内存.在充分理解了垃圾收集算法和执行过程后,才能有效的优化它的性能. 有些垃圾收集专用于特殊的应用程序.比如,实时应用程序主要是为了避免垃圾收集中断,而大多数OLTP应用程序则注重整体效率.垃圾收集的目的在于清除不再使用的对象.gc通过确定对象是否被活动对象引用来确定是否收集该对象.两种常用的方法是引用计数和对象引用遍历.引用计数引用计数存储对特定对象的所有引用数,也就是说,当应用程序创建引用以及引用超出范围时,jvm

java的GC与内存泄漏

从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C语言的同学都知道,在C语言中内存的开辟和释放都是由我们自己来管理的,每一个new操作都要对于一个delete操作,否则就会参数内存泄漏和溢出的问题,导致非常槽糕的后果.但在Java开发过程中,则完全不需要担心这个问题.因为jvm提供了自动内存管理的机制.内存管理的工作由jvm帮我们完成.这样我们就不

大数据:Spark Standalone 集群调度(一)从远程调试开始说application创建

远程debug,特别是在集群方式时候,会很方便了解代码的运行方式,这也是码农比较喜欢的方式 虽然scala的语法和java不一样,但是scala是运行在JVM虚拟机上的,也就是scala最后编译成字节码运行在JVM上,那么远程调试方式就是JVM调试方式 在服务器端: -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=7001,suspend=y 客户端通过socket就能远程调试代码 1. 调试submit, master, worke

Jvm 内存浅析 及 GC个人学习总结

从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C语言的同学都知道,在C语言中内存的开辟和释放都是由我们自己来管理的,每一个new操作都要对于一个delete操作,否则就会参数内存泄漏和溢出的问题,导致非常槽糕的后果.但在Java开发过程中,则完全不需要担心这个问题.因为jvm提供了自动内存管理的机制.内存管理的工作由jvm帮我们完成.这样我们就不