172

Ehcacheは、オンヒープメモリとオフヒープメモリについて説明しています。違いはなんですか?それらを構成するために使用されるJVM引数は何ですか?

4

6 に答える 6

194

オンヒープストアとは、Javaヒープに存在する(またGCの対象となる)オブジェクトを指します。一方、オフヒープストアとは、EHCacheによって管理されているが、ヒープの外部に格納されている(GCの対象ではない)(シリアル化された)オブジェクトを指します。オフヒープストアは引き続きメモリで管理されるため、オンヒープストアよりもわずかに低速ですが、ディスクストアよりは高速です。

オフヒープストアの管理と使用に関連する内部の詳細は、質問に投稿されたリンクではあまり明確ではないため、オフディスクの管理に使用されるTerracottaBigMemoryの詳細を確認することをお勧めします。お店。BigMemory(オフヒープストア)は、数メガバイトまたはギガバイトの大きさのヒープでのGCのオーバーヘッドを回避するために使用されます。BigMemoryは、他のネイティブJavaオブジェクトとは異なり、GCの対象とならない直接のByteBufferを介して、JVMプロセスのメモリアドレス空間を使用します。

于 2011-05-23T00:09:32.973 に答える
114

http://code.google.com/p/fast-serialization/wiki/QuickStartHeapOffから

ヒープオフロードとは何ですか?

通常、割り当てる一時的でないオブジェクトはすべて、Javaのガベージコレクターによって管理されます。VMはガベージコレクションを実行する適切な仕事をしますが、ある時点でVMはいわゆる「フルGC」を実行する必要があります。完全なGCには、割り当てられたヒープ全体のスキャンが含まれます。つまり、GCの一時停止/スローダウンは、アプリケーションのヒープサイズに比例します。だから、「メモリは安い」と言っている人を信用しないでください。Javaのメモリ消費は、パフォーマンスを低下させます。さらに、1Gbを超えるヒープサイズを使用すると、顕著な一時停止が発生する可能性があります。ほぼリアルタイムの処理が行われている場合、これは厄介なことがあります。クラスターまたはグリッドでは、Javaプロセスが応答しなくなり、クラスターからドロップされる可能性があります。

ただし、今日のサーバーアプリケーション(多くの場合、肥大化したフレームワークの上に構築されています;-))は、4Gbをはるかに超えるヒープを簡単に必要とします。

これらのメモリ要件に対する1つの解決策は、オブジェクトの一部を非Javaヒープ(OSから直接割り当てられる)に「オフロード」することです。幸い、java.nioは、メモリの「アンマネージ」チャンク(メモリマップトファイルも含む)を直接割り当て/読み取りおよび書き込みするためのクラスを提供します。

したがって、大量の「管理されていない」メモリを割り当て、これを使用してオブジェクトをそこに保存できます。任意のオブジェクトをアンマネージメモリに保存するための最も実行可能な解決策は、シリアル化を使用することです。これは、アプリケーションがオブジェクトをオフヒープメモリにシリアル化し、後で逆シリアル化を使用してオブジェクトを読み取ることができることを意味します。

Java VMによって管理されるヒープサイズを小さく保つことができるため、GCの一時停止は数ミリ単位であり、誰もが満足して仕事を終えています。

このようなオフヒープバッファのパフォーマンスは、主にシリアル化の実装のパフォーマンスに依存することは明らかです。良いニュース:何らかの理由でFST-シリアル化はかなり高速です:-)。

使用シナリオの例:

  • サーバーアプリケーションのセッションキャッシュ。メモリマップトファイルを使用して、ギガバイトの(非アクティブな)ユーザーセッションを保存します。ユーザーがアプリケーションにログインすると、データベースを処理しなくても、ユーザー関連のデータにすばやくアクセスできます。
  • 計算結果のキャッシュ(クエリ、htmlページ、..)(計算がcの結果オブジェクトの逆シリアル化よりも遅い場合にのみ適用可能)。
  • メモリマップトファイルを使用した非常にシンプルで高速な永続性

編集:一部のシナリオでは、ConcurrentMarkAndSweepやG1などのより高度なガベージコレクションアルゴリズムを選択して、より大きなヒープをサポートする場合があります(ただし、これには16GBヒープを超える制限もあります)。改善された「一時停止のない」GC(Azul)を備えた商用JVMも利用できます。

于 2012-12-15T17:31:03.220 に答える
44

ヒープは、動的に割り当てられたオブジェクトが存在するメモリ内の場所です。使用した場合newは、ヒープ上にあります。これは、関数スタックが存在するスタックスペースとは対照的です。ローカル変数がある場合、その参照はスタック上にあります。Javaのヒープはガベージコレクションの対象であり、オブジェクトは直接使用できます。

EHCacheのオフヒープストレージは、通常のオブジェクトをヒープから取り出してシリアル化し、EHCacheが管理するメモリのチャンクにバイトとして保存します。それはディスクに保存するようなものですが、それでもRAMにあります。この状態では、オブジェクトを直接使用することはできません。最初に逆シリアル化する必要があります。また、ガベージコレクションの対象ではありません。

于 2011-05-23T00:14:36.393 に答える
21

短い写真で

要するにJavaオン/オフヒープストレージ

写真クレジット


詳細画像

Javaオン/オフヒープストレージの詳細

写真クレジット

于 2017-07-23T16:35:44.687 に答える
1

100%ではありません。ただし、ヒープは、Java自体またはehcache自体の機能のいずれかでコードの機能に組み込まれている、(RAM上の)割り当てられたスペースのオブジェクトまたはセットであるように見えます。また、オフヒープのRamには、次のような独自のシステムがあります。良い; ただし、これは整理されていないため1桁遅くなります。つまり、ヒープ(RAMの1つの長いスペースのセットを意味します)を使用せず、代わりに異なるアドレススペースを使用するため、効率がわずかに低下する可能性があります。

そしてもちろん、次の層はハードドライブスペース自体です。

私はehcacheを使用しないので、あなたは私を信頼したくないかもしれませんが、それは私が彼らのドキュメントから集めたものです。

于 2011-05-23T00:06:51.213 に答える
0

JVMは、オフヒープメモリについて何も知りません。Ehcacheは、ディスク上のキャッシュとメモリ内のキャッシュを実装します。

于 2011-05-23T00:06:47.170 に答える