虽然已经再三提到这一点,但是还是需要注意,GC 只管理那些容器对象,比如 List、Dict、Set 之类,这些对象的创建都是通过 _PyObject_GC_Alloc 实现,GC 则在每次通过这个函数创建之时,试图进行内存回收。当然并不是每次都会触发,内存回收需要满足一定的条件,其中最主要的一条是:

// Modules/gcmodule.c:1971

0 代对象总数需要超过阈值: 700,所以内存回收的首要条件是 0 代内存的情况。

在继续深入之前,我们先大致对分代回收有一个大致了解。分代思想是基于这样一个假设:

大多数对象都是短暂出现,很快被释放;生存了一段时间的对象,似乎有可能生存更久。

分代思想的目的是将探测的注意力集中在 “临时” 对象上,对于那些内存中 “似乎” 更有可能万年长青的 “长者” 网开一面,容后处理。Python 采用了 3 代模式:

每经过一次回收,年轻代中逃过 GC 生存下来对象,会被提升到更老的代,享受一些优待,减少对它们的扫描。

现在我们继续,当 0 代对象数量超过阈值 700 后,就会进入 collect_generations 函数:

// Modules/gcmodule.c:1246

这些代码说明,开始内存回收的条件是由 0 代决定,而具体回收哪几代对象则以最老的代为准。注意这里检测到符合条件的最老一代就立刻 break 了,不要轻易认为只处理这一代,稍后会看到为什么不能这么武断。

从 collect_with_callback 函数开始,短暂的经过 collect_with_callback 函数,很快就进入了最核心的 collect 函数,这里先大致梳理 collect 函数的梗概:

static 

这样就比较清晰了,检测到某一代内存符合回收条件,所有比其更年轻的对象都会被纳入回收范围。既然每次都是从最古老的对象开始检查,为什么最开始又偏偏以 0 代为开始 gc 的条件呢? 其实很容易理解,除了 0 代,其他代对象都是从 0 代升格的,如果 0 代对象数量没有发生变化,1、2 代的对象数量自然也不会有什么太大变动了。

关注我,了解程序员的烧脑日常,还有开源 Python 教程。

full gc 次数_32. GC 是怎样工作的?相关推荐

  1. 接口访问次数_系统运行缓慢,CPU 100%,Full GC次数过多,这一招帮你全搞定

    处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题.当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警.本文主要针对系统运行缓慢这 ...

  2. 系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://h5ip.cn/uWWR 处理过线上问题的同学 ...

  3. fullgc频繁的原因_系统运行缓慢,CPU 100%,Full GC次数过多,这一招帮你全搞定

    处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题.当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警.本文主要针对系统运行缓慢这 ...

  4. java 查看gc 次数_使用Jstat监控gc情况

    性能测试过程中,我们该如何监控java虚拟机内存的使用情况,用以判断JVM是否存在内存问题呢?如何判断JVM垃圾回收是否正常?一般的top指令基本上满足不了这样的需求,因为它主要监控的是总体的系统资源 ...

  5. JVM学习笔记之-堆,年轻代与老年代,对象分配过程,Minor GC、Major GC、Full GC,堆内存大小与OOM,堆空间分代,内存分配策略,对象分配内存,小结堆空间,逃逸分析,常用调优工具

    堆的核心概述 概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域.Java堆区在JVM 启动的时候即被创建,其空间大小也就确定了.是JVM管理的最大一块内存空间. 堆内存的大小是可 ...

  6. 常见的GC算法(GC的背景与原理)

    常见的GC算法(GC的背景与原理) GC 是英文词汇Garbage Collection的缩写,中文一般直译为 "垃圾收集".当然也会说 "垃圾回收". 三种垃 ...

  7. gc java_Java的GC机制

    jvm 中,程序计数器.虚拟机栈.本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于 堆和方法区中,在程序运行期间, ...

  8. 死磕GC:Java GC 和 GO GC 大对比,看完秒成高高手

    说在前面 现在拿到offer超级难,甚至连面试电话,一个都搞不到. 尼恩的技术社群中(50+),很多小伙伴凭借 "左手云原生+右手大数据"的绝活,拿到了offer,并且是非常优质的 ...

  9. java young gc_java old GC和young GC

    Java内存分配机制 摘自:http://www.cnblogs.com/zhguang/p/3257367.html 这里所说的内存分配,主要指的是在堆上的分配,一般的,对象的内存分配都是在堆上进行 ...

最新文章

  1. linux文件怎么操作,linux文件操作学习1
  2. linux uvc协议_linux使用UVC采集数据
  3. 想写好前端,先练好内功
  4. Git是目前世界上最先进的分布式版本控制系统(没有之一)。
  5. 开源GIS(五)——openlayers中interaction的select、draw与modify
  6. [2018.04.23 T1] 数学
  7. QImage图片裁剪
  8. 客户端禁止 Cookie,Session怎么实现
  9. WEB - 使用CSS 画一个正方体
  10. Python学习-小黑屋游戏
  11. 风扇空调照明灯动画的创建
  12. html视频顺序播放,三个视频并排显示按顺序播放的效果怎么制作?怎么使同框视频依次播放|视频合成软件...
  13. abs绝对位置指令 三菱plc_三菱FX系列PLC方便指令的使用方法
  14. Android 蓝牙 -- 还原网络设置 删除蓝牙所有存储配对信息流程分析---全网唯一
  15. 网络工程师【软考】02
  16. 电脑重启bootmgr_电脑出现bootmgr is missing怎么办
  17. 模拟微信内部跳转至微信支付
  18. 产品:“嘘,这事千万别让开发知道”
  19. 人工智能-强化学习-算法:Critic 【用于评价一个 Actor/Policy π】--> Q-Learning【用于训练出来一个最优 Actor/Policy π,擅长处理离散型 actions】
  20. fabric搭建及环境配置

热门文章

  1. java 抽象 属性_在java中如何定义一个抽象属性示例详解
  2. C语言socket发送json,C++实现Socket传输json封装的Mat
  3. linux的qt5.5,Qt 5.5 正式发布,完全支持 Windows 10
  4. Arch Linux 服务器,Arch Linux不适合当作服务器操作系统的四大原因
  5. linux 多块磁盘挂一个文件夹,Linux单目录挂载多块磁盘
  6. 动态数据的国际化、几种主要的国际化标签
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的体育场地预约管理系统
  8. QT中QLabel的常见使用方法
  9. jQuery做个TextBox自动完成条
  10. 简单工厂(Simple Factory)模式