2017-08-08 28 views
0

我正在開發簡單的分佈式內存鍵值存儲服務。 在我的情況下,我將Ignite嵌入爲使用maven依賴。Apache Ignite關閉堆內存不工作(在我的猜測)

該應用程序具有簡單的控制器,它是獲取和放置API。

獲取API是從點燃緩存中獲取對象,Put API是放置對象來點燃緩存。

無論如何,我做負載測試,並使用visual vm監視jvm狀態,我使用visual gc插件和使用緩衝區監視器插件的直接緩衝區觀察每個堆區域(例如eden,suv,old)。

當我開始加載測試時,eden區域逐漸填滿並移動舊區域,而不是直接緩衝區。當負載測試結束時,直接緩衝區只使用150kb,而舊區使用512m。
Image by visualGC
Image by buffer monitor plugin

※數據大小可能是500MB。

我想,直接緩衝區幾乎不用。爲什麼?聽到是我的配置

-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+版本默認使用off-heap。