2017-08-08 22 views
0

私はメモリ内の単純な分散型のキーバリューストレージサービスを開発中です。 私の場合は、Igniteをmaven依存関係を使って埋め込みます。Apacheヒープメモリが動作しない(私の推測で)

アプリケーションにはgetおよびput APIという単純なコントローラがあります。

get APIはIgniteキャッシュからオブジェクトを取得し、Put APIはキャッシュを点火するオブジェクトになります。

とにかく、私はロードテストを行い、ビジュアルVMを使ってjvmステータスを監視しました。私はビジュアルgcプラグインとバッファモニタプラグインを使ってダイレクトバッファを使って各ヒープ領域(例えばeden、suv、old)を観察しました。

ロードテストを開始したとき、eden領域は徐々に満たされ、直接バッファではなく古い領域が移動しました。負荷テストが終了したら、ダイレクトバッファは150kbのみを使用しますが、古い領域は512mを使用します。
Image by visualGC
Image by buffer monitor plugin

※データサイズは500メガバイトであるかもしれません。

おそらく、ダイレクトバッファーはほとんど使われていないと思います。どうして?あなたの設定は私の設定です

-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1g -Xmx1g -XX:MaxDirectMemorySize=6g -XX:+AlwaysPreTouch -XX:NewSize=512m -XX:GCTimeRatio=4 -XX:InitiatingHeapOccupancyPercent=30 -XX:ConcGCThreads=4 -XX:+UseParNewGC -XX:+UseTLAB -XX:+ScavengeBeforeFullGC -XX:MaxNewSize=512m -XX:MaxMetaspaceSize=128m -XX:CompressedClassSpaceSize=32m -XX:SurvivorRatio=6 -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+CMSScavengeBeforeRemark -XX:ParallelGCThreads=6 -XX:MaxTenuringThreshold=5 -XX:MaxGCPauseMillis=1000 -XX:+DisableExplicitGC -XX:+ExplicitGCInvokesConcurrent -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data/log/catalina/cc.rnd.subnode1/GC.log -XX:+CMSClassUnloadingEnabled -Dspring.profiles.active=production 

答えて

1

Igniteは、ヒープスペースにデータを格納するためにsun.misc.Unsafeを使用します。これは最高のパフォーマンスと柔軟性を提供しますが、監視ツールには反映されません。主にノード間の通信に使用される直接バッファ。 Javaプロセスのサイズを分析し、ヒープを使用してメモリー消費量を確認することができます。大きなデータでは、プロセス・サイズはヒープよりもはるかに大きくなります。

Apache Ignite 1.xバージョンを使用する場合は、off-heapを設定する必要があります。 2.0以降のバージョンでは、デフォルトでオフヒープが使用されます。

関連する問題