0

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はディスクIOが関連しているようです。cachevmstat

$ 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出力の「cache」列に反映されるかどうかについてもっと知りたいです。

4

1 に答える 1

1

それを行うための良い方法は実際にはありません-Cメモリモデルは、Javaメモリモデルが許可するのと同じ種類の動作を単に許可しません。もちろん、Javaのメモリモデルは、オペレーティングシステムとのインターフェイス時にCモデルに基づいて構築されます。そのため、Javaヒープはアプリケーションランチャーによって手動で制限する必要があります。

「buff」列と「cache」列は、カーネルが使用するページ/ディスクキャッシュと内部バッファに関連しています。これらのキャッシュはカーネルによって自動的に処理されます。たとえば、ファイルを読み取ると、メモリが不足するとスワップデバイス(「swpd」)にコミットされるのと同じように、内容が「キャッシュ」使用数になります。

于 2012-09-28T01:45:17.687 に答える