2017-08-08 29 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。