动态内存分配器

  SQLite源代码包含几种不同的内存分配器模块,可以在编译时选择,或在启动时作为一个有限的扩展。SQLite需要动态分配一块内存时,它通常是调用底层操作系统默认的内存处理函数,使SQLite从应用程序堆中分配内存。然而,程序员可以通过sqlite3_config函数配置SQLite,使其进行自己的内部的内存管理。
  SQLite负责内存管理的模块是malloc.c,其中实现了很多特性。包括内存无泄漏,内存使用统计,内存使用设置上限等。SQLite通过内存分配来获取各种对象(数据库连接对象等)所需的内存,用于数据库文件的缓存和保存查询结果。SQLite内存分配子系统被认为是可靠的,可预料的,健壮的以及高效的。 SQLite的内存分配子系统有如下特征:

  1. 对内存分配失败的健壮处理 如果一个内存分配请求失败(即malloc()或realloc()返回NULL),SQLite将释放未关联的缓存页,然后重新进行分配请求。如果失败,SQLite返回SQLITE_NOMEM给应用程序。
  2. 无内存泄漏 sqlite负责分配内存和空闲内存的管理,应用程序负责销毁已分配的任何对象。例如应用程序必须使用sqlite3_finalize()结束每个预处理SQL语句,使用sqlite3_close()关闭每个数据库连接。
  3. 内存使用限制 sqlite3_soft_heap_limit64()机制可以让应用程序设置SQLite的内存使用限制。SQLite会从缓存中重用内存,而不是分配新的内存,以满足设置的限制。
  4. 零分配选项 应用程序可以在启动时给SQLite提供几个大块内存的缓冲区,SQLite将用这些缓冲区作为它所有内存分配的需要,不再调用系统的malloc()free()
  5. 对防止内存分配失败或堆内存出现碎片提供形式化的保证 SQLite能配置成保证不会出现内存分配失败或内存碎片。这个特性对长期运行、高可靠性的嵌入式系统至关重要,在这样的系统上一个内存分配错误可能会导致整个系统失效。
  6. 内存使用统计 应用程序可以统计SQLite使用了多少内存,可以检测内存使用是否接近或超过设计限制。
  7. 尽量少调用分配器 系统的malloc()free()实现在很多系统上是低效的。SQLite通过尽量少地使用malloc()free()来减少整个处理时间。具体通过重用内存来实现。
  8. 开放式存取 可插拨的SQLite扩展模块或应用程序自己可以通过sqlite3_malloc(),sqlite3_realloc()sqlite3_free()接口来访问SQLite使用的底层内存分配器。
  9. 可选的内存分配器 应用程序可以使用sqlite提供的多种内存分配器和应用程序定义的分配器。

results matching ""

    No results matching ""