描述
设置和/或查询可能由SQLite分配的堆内存量的软限制。
C / C ++语法
sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N); |
PB语法
FUNCTION sqlite3_soft_heap_limit64 ( _ BYVAL numBytes AS QUAD _ ) AS QUAD |
参数
numBytes
[in] 字节数。如果的numBytessv为负值,则不会对软堆限制进行任何更改。因此,软堆限制的当前大小可以通过使用负参数调用sqlite3_soft_heap_limit64来确定。
如果的numBytessv为零,则禁用软堆限制。
返回值
在调用之前软堆的大小限制,否则在出现错误的情况下。
备注
SQLite通过减少页面缓存中保留的页面数来保持堆内存利用率低于软堆限制,因为堆内存使用量接近极限。软堆限制是“软”,因为即使SQLite努力保持低于限制,它将超出限制,而不是生成SQLITE_NOMEM错误。换句话说,软堆限制只是咨询。
如果一个或多个以下条件为真,则在当前实现中不强制执行软堆限制:
· | 软堆限制设置为零。 |
· | 使用sqlite3_config(SQLITE_CONFIG_MEMSTATUS,...)启动时间选项和SQLITE_DEFAULT_MEMSTATUS编译时选项的组合禁用内存计费。 |
· | 使用sqlite3_config(SQLITE_CONFIG_PCACHE2,...)指定备用页面缓存实现。 |
· | 页面缓存从其自己的由sqlite3_config(SQLITE_CONFIG_PAGECACHE,...)提供的内存池分配,而不是从堆中分配。 |
从SQLite版本3.7.3开始,无论是否调用SQLITE_ENABLE_MEMORY_MANAGEMENT编译时选项,都会强制执行软堆限制。使用SQLITE_ENABLE_MEMORY_MANAGEMENT,在每个内存分配上强制执行软堆限制。没有SQLITE_ENABLE_MEMORY_MANAGEMENT,只有当页面缓存分配内存时,才会强制执行软堆限制。测试表明,由于页面缓存是SQLite中占主导地位的内存用户,所以大多数应用程序将在不使用SQLITE_ENABLE_MEMORY_MANAGEMENT的情况下实现足够的软堆限制。
SQLite将强制执行软堆限制的情况可能会在将来的SQLite版本中发生更改。
C ++实现代码
/*
** Set the soft heap-size limit for the library. Passing a zero or
** negative value indicates no limit.
*/
SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 n){
sqlite3_int64 priorLimit;
sqlite3_int64 excess;
#ifndef SQLITE_OMIT_AUTOINIT
int rc = sqlite3_initialize();
if( rc ) return -1;
#endif
sqlite3_mutex_enter(mem0.mutex);
priorLimit = mem0.alarmThreshold;
sqlite3_mutex_leave(mem0.mutex);
if( n<0 ) return priorLimit;
if( n>0 ){
sqlite3MemoryAlarm(softHeapLimitEnforcer, 0, n);
}else{
sqlite3MemoryAlarm(0, 0, 0);
}
excess = sqlite3_memory_used() - n;
if( excess>0 ) sqlite3_release_memory((int)(excess & 0x7fffffff));
return priorLimit;
}