首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Impose A Limit On Heap Size

sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N);

sqlite3_soft_heap_limit64()接口设置and/or查询可由SQLite分配的堆内存量的软限制。随着堆内存使用量接近限制,SQLite通过减少页面缓存中保存的页面数量,努力将堆内存利用率保持在软堆限制以下。软堆限制是“软”,因为尽管SQLite努力保持低于限制,它将超出限制,而不会产生SQLITE_NOMEM错误。换句话说,软堆限制只是建议性的。

来自sqlite3_soft_heap_limit64()的返回值是调用之前的软堆限制的大小,或者在出现错误时为负数。如果参数N为负数,则不会更改软堆限制。因此,软堆限制的当前大小可以通过调用带有负参数的sqlite3_soft_heap_limit64()来确定。

如果参数N为零,那么软堆限制将被禁用。

如果满足以下一个或多个条件,则在当前实现中不执行软堆限制:

  • 软堆限制设置为零。
  • 使用sqlite3_config(SQLITE_CONFIG_MEMSTATUS,...)启动时选项和SQLITE_DEFAULT_MEMSTATUS编译时选项的组合禁用内存记帐。
  • 使用sqlite3_config(SQLITE_CONFIG_PCACHE2,...)指定备用页面缓存实现。
  • 页面缓存从sqlite3_config提供的自己的内存池(SQLITE_CONFIG_PAGECACHE,...)分配而不是从堆中分配。

从SQLite 版本3.7.3(2010-10-08)开始,无论是否调用SQLITE_ENABLE_MEMORY_MANAGEMENT编译时选项,都会强制实施软堆限制。使用SQLITE_ENABLE_MEMORY_MANAGEMENT,软堆限制将在每个内存分配上执行。如果没有SQLITE_ENABLE_MEMORY_MANAGEMENT,只有当内存由页面缓存分配时才会执行软堆限制。测试表明,因为页面缓存是SQLite中占主导地位的内存用户,所以大多数应用程序将在不使用SQLITE_ENABLE_MEMORY_MANAGEMENT的情况下实现足够的软堆限制。

在未来的SQLite版本中,SQLite强制执行软堆限制的情况可能会发生变化。

扫码关注腾讯云开发者

领取腾讯云代金券