Linux内存管理器中的“弱参考”?

时间:2012-09-28 01:40:45

标签: linux caching memory-management weak-references

在Java中,如果内存耗尽,则弱引用会被垃圾收集。在Linux中,malloc()始终返回强引用,即。在调用者调用free()函数之前,指针永远不会被释放。

我想为缓存分配一个缓冲区,当内存不足时可以自动释放缓冲区,如下所示:

cache_t cache;
if (! cache_alloc(&cache))
    die("Memory out");

cache_lock(&cache); // realloc cache mem if it is collected

if (! cache->user_init) { // The "user_init" maybe reset if the cache mem is collected
  // lazy-init the cache...
  load_contents(cache->mem, ...);
  cache->user_init = 1;
}

// do with cache..
stuff_t *stuff = (stuff_t *) cache->mem;
...

cache_unlock(&cache);

buff输出中的cachevmstat似乎与磁盘IO相关:

$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0  51604 554220  13384 314852    3   10   411   420  702 1063  8  3 75 14

好吧,我想知道更多关于我的示例中的缓存是否可以反映在vmstat输出中的“缓存”列中。

1 个答案:

答案 0 :(得分:1)

实际上没有一种好方法 - C内存模型根本不允许Java内存模型允许的相同行为。当然,Java的内存模型在与操作系统连接时构建在C模型上,这就是为什么Java堆必须由应用程序启动器手动限制。

“buff”和“cache”列与内核使用的页面/磁盘缓存和内部缓冲区相关。这些缓存由内核自动处理 - 例如,读取文件会将内容放在“缓存”使用数中,就像内存耗尽将其提交给交换设备(“swpd”)一样。 / p>