【雕爷学编程】MicroPython手册之内置模块 gc 内存管理和垃圾回收

在这里插入图片描述

MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。

在这里插入图片描述

MicroPython的内置模块gc是一个用于控制垃圾收集器的模块,它可以用来管理和优化动态内存的使用。它的主要特点是:

1、它可以使用enable()、disable()、collect()等方法来启用、禁用或手动触发垃圾收集,释放不再使用的内存空间。
2、它可以使用mem_alloc()、mem_free()等方法来获取当前分配和可用的堆内存的字节数,监测内存的使用情况。
3、它可以使用threshold()方法来设置或查询额外的垃圾收集阈值,即在分配了一定数量的字节后自动触发垃圾收集,以防止内存碎片化。

gc模块的应用场景有:

1、用于提高内存的利用率和效率,避免内存泄漏和溢出,提升程序的性能和稳定性。
2、用于调试和测试程序的内存消耗和分配情况,发现和解决内存相关的问题。
3、用于实现一些特殊的功能,例如弱引用、循环引用、对象终结器等。

gc模块的注意事项有:

1、gc模块依赖于MicroPython的垃圾收集器,它是一种标记-清除算法1,与CPython的垃圾收集器有所不同23,因此不能完全兼容CPython的gc模块。
2、gc模块使用的回调函数是硬件中断,需要尽量简短和快速,避免执行复杂或耗时的操作,以免影响系统性能和稳定性。
3、gc模块使用的垃圾收集阈值是一种启发式度量,其效果会因应用程序而异,以及阈值参数的最佳值。需要根据实际情况进行调整和测试。

以下是MicroPython的内置模块gc几个实际运用程序案例:

案例一:释放不再使用的对象

# 导入gc模块
import gc

# 创建一个列表对象,并赋值给变量a
a = [1, 2, 3]

# 打印当前分配的堆内存字节数
print('Before:', gc.mem_alloc())

# 删除变量a,解除对列表对象的引用
del a

# 手动触发垃圾收集,释放列表对象占用的内存空间
gc.collect()

# 打印当前分配的堆内存字节数
print('After:', gc.mem_alloc())

案例二:监测程序的内存消耗

# 导入gc模块
import gc

# 定义一个函数,用于创建一个大型字符串对象,并返回其长度
def create_string():
    # 创建一个包含10000个字符'a'的字符串对象,并赋值给变量s
    s = 'a' * 10000
    # 返回字符串对象的长度
    return len(s)

# 打印当前可用的堆内存字节数
print('Before:', gc.mem_free())

# 调用函数,并打印返回值
print('Length:', create_string())

# 打印当前可用的堆内存字节数
print('After:', gc.mem_free())

案例三:设置额外的垃圾收集阈值

# 导入gc模块
import gc

# 设置额外的垃圾收集阈值为1000字节
gc.threshold(1000)

# 打印当前阈值
print('Threshold:', gc.threshold())

# 创建一个列表对象,并赋值给变量a
a = [1, 2, 3]

# 打印当前分配的堆内存字节数
print('Before:', gc.mem_alloc())

# 循环10次,每次向列表对象追加一个元素
for i in range(10):
    a.append(i)

# 打印当前分配的堆内存字节数
print('After:', gc.mem_alloc())

案例4:内存使用情况监控:

import gc

# 获取当前内存使用情况
mem_info = gc.mem_info()

# 输出内存使用信息
print("Total memory:", mem_info[0])
print("Used memory:", mem_info[1])
print("Free memory:", mem_info[2])

在这个示例中,我们使用gc模块的mem_info()函数获取当前的内存使用情况。该函数返回一个元组,包含总内存、已使用内存和可用内存的信息。我们通过索引访问元组的不同位置,并打印出内存使用信息。输出结果类似于:

Total memory: 123456
Used memory: 7890
Free memory: 116566

这样可以帮助我们监控和了解MicroPython程序的内存使用情况。

案例5:手动进行垃圾回收::

import gc

# 创建一些对象
a = [1, 2, 3]
b = "Hello, world!"
c = 12345

# 删除对象引用
del a, b, c

# 执行垃圾回收
gc.collect()

在这个示例中,我们使用gc模块的collect()函数手动触发垃圾回收。首先,我们创建了一些对象a、b和c,然后通过del语句删除了对这些对象的引用。最后,我们调用gc.collect()函数来执行垃圾回收操作,清理不再使用的内存空间。

案例六:禁用自动垃圾回收:

import gc

# 禁用自动垃圾回收
gc.disable()

# 创建一些对象
a = [1, 2, 3]
b = "Hello, world!"
c = 12345

# 删除对象引用
del a, b, c

# 启用自动垃圾回收
gc.enable()

在这个示例中,我们使用gc模块的disable()函数禁用了自动垃圾回收。然后,我们创建了一些对象a、b和c,并通过del语句删除了对这些对象的引用。最后,我们使用gc.enable()函数重新启用自动垃圾回收。禁用自动垃圾回收可以在某些情况下提高程序的性能,但需要注意及时手动进行垃圾回收,以避免内存泄漏和资源浪费。这些实际运用程序案例展示了使用MicroPython内置模块gc的功能。通过使用gc模块,可以监控内存使用情况、手动触发垃圾回收以及控制自动垃圾回收的行为。这些功能可以帮助我们更好地管理和优化MicroPython程序的内存资源。

案例七:手动触发垃圾回收

import gc

# 创建一些对象
obj1 = [1, 2, 3]
obj2 = "Hello, World!"

# 手动触发垃圾回收
gc.collect()

# 打印内存使用情况
print("内存使用情况:", gc.mem_free())

在这个例子中,我们导入了 gc 模块,并创建了两个对象 obj1 和 obj2。通过调用 gc.collect() 方法,我们手动触发了垃圾回收。最后,我们使用 gc.mem_free() 函数打印了内存的可用空间。

案例八:. 禁用自动垃圾回收

import gc

# 禁用自动垃圾回收
gc.disable()

# 创建一些对象
obj1 = [1, 2, 3]
obj2 = "Hello, World!"

# 手动触发垃圾回收
gc.collect()

# 打印内存使用情况
print("内存使用情况:", gc.mem_free())

在这个例子中,我们导入了 gc 模块,并通过调用 gc.disable() 方法禁用了自动垃圾回收。然后,我们创建了两个对象 obj1 和 obj2。即使我们手动调用了 gc.collect() 方法,由于禁用了自动垃圾回收,对象并不会被回收。最后,我们使用 gc.mem_free() 函数打印了内存的可用空间。

案例九:追踪内存分配和释放

import gc

# 追踪内存分配和释放
gc.set_debug(gc.DEBUG_STATS)

# 创建一些对象
obj1 = [1, 2, 3]
obj2 = "Hello, World!"

# 手动触发垃圾回收
gc.collect()

# 打印内存分配和释放的统计信息
print("内存分配和释放统计信息:", gc.garbage)

在这个例子中,我们导入了 gc 模块,并通过调用 gc.set_debug(gc.DEBUG_STATS) 方法设置了调试模式,以追踪内存的分配和释放。然后,我们创建了两个对象 obj1 和 obj2。通过手动调用 gc.collect() 方法,我们触发了垃圾回收。最后,我们使用 gc.garbage 查看垃圾收集器收集的对象列表,以打印内存分配和释放的统计信息。

这些示例展示了在 MicroPython 中使用 gc 模块的实际应用。gc 模块提供了一些函数和方法,用于手动触发垃圾回收、禁用自动垃圾回收以及追踪内存分配和释放的情况。通过利用 gc 模块,你可以更好地控制和管理内存资源。

在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值