【发布时间】:2016-12-24 09:28:21
【问题描述】:
我的 ignite 服务器运行在 64G 内存的机器上。总缓存占用大约 20G 内存(堆外内存,我在盯着 ignitevisorcmd.sh 后使用 cache -a 命令获取此信息),但是当我运行top命令查看内存使用情况,貌似这个进程占用了50G内存,请问怎么会这样?
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10001 root 20 0 63.1G 51G 15m S 70% 80% 400:57.38 java
【问题讨论】:
-
有人可以看看吗?我想知道如何知道 ignite 服务器除了缓存之外需要多少内存。
-
你的堆外配置是什么,堆的使用是什么?
-
感谢@Mitya 的回复。我只使用堆外。配置如下:
cacheConfig.setCacheMode(CacheMode.PARTITIONED); cacheConfig.setBackups(0); cacheConfig.setMemoryMode(CacheMemoryMode.OFFHEAP_TIERED); cacheConfig.setOffHeapMaxMemory(0); cacheConfig.setOffHeapMaxMemory(48*1024*1024*1024); -
Tom,你能检查一下堆的大小并分析堆转储吗?例如,使用 VisualVM。如果您有一些处理逻辑,请记住任何对堆外条目的访问都会将其加载到堆中。还有一个 bug 在 1.7 版本中修复。
-
感谢@MityaXMitya 的回复。我正在使用 Ignite 1.8。根据您的评论提出一个快速问题:
any access to offheap entry will load it to heap。如果我的数据在堆外是20G,那么当我对缓存执行sqlselect *时,所有条目都会被带到堆上,这也将占用大约20G的堆内存?