【问题标题】:"Weak reference" in Linux memory manager?Linux内存管理器中的“弱引用”?
【发布时间】:2012-09-28 01:40:45
【问题描述】:

在 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 的输出中的 buffcache 似乎与磁盘 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 输出的“缓存”列中。

【问题讨论】:

  • 操作系统通过 MMU、分页等为你做这件事。那何必呢?
  • @Vlad:我不明白..你能详细解释一下吗?
  • @VladLazarenko 我认为 OP 是在谈论虚拟地址空间耗尽,而不是物理内存。操作系统没有解决前者。

标签: linux caching memory-management weak-references


【解决方案1】:

确实没有什么好的方法——C 内存模型根本不允许 Java 内存模型允许的那种行为。 Java 的内存模型在与操作系统交互时当然是建立在 C 模型之上的,这就是为什么 Java 堆必须由应用程序启动器手动限制的原因。

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

【讨论】:

  • 你是对的。但是 Java 做的远不止“在内存耗尽时释放它”。我不太关心Linux以外的其他操作系统,我想也许有Linux特定的解决方案。
  • 当 Linux(和其他操作系统)给你一个内存地址(通过sbrkmmap 等)时,他们承诺这个内存地址将永远有效。 C 内存模型中没有直接的 this may be available 类型的指针。
  • 我记得 Win32 有类似分配带有MOVEABLEDISCARDABLE 标志的缓冲区,并返回一个内存句柄。
  • 当然,C 中的每个指针都是强引用。但是“cache_t”中的“mem”指针应该由MMU而不是C移动或释放。所以,我认为该函数是可以实现的。
  • Java 内存模型提供的所有功能都不能在 C 中完成……您只需要自己完成即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
相关资源
最近更新 更多