在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);
似乎vmstat
输出中的buff
和cache
与磁盘 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 输出的"缓存"列中。
确实没有一个好的方法可以做到这一点 - C 内存模型根本不允许 Java 内存模型允许的相同行为。当然,Java 的内存模型在与操作系统接口时建立在 C 模型之上,这就是为什么 Java 堆必须由应用程序启动器手动限制的原因。
"buff"和"cache"列与内核使用的页面/磁盘缓存和内部缓冲区相关。这些缓存由内核自动处理 - 例如,读取文件会将内容放在"缓存"使用编号中,就像内存不足会将其提交到交换设备("swpd")一样。