我正在开发简单的分布式内存键值存储服务。 在我的情况下,我将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