测量或至少在一定程度上准确估计包含自定义对象的哈希映射的总内存消耗的最佳选择是什么?
背景:
我们的系统有多个内存存储(ConcurrentHashMap 的),其中包含 1K-200K 不同类型的对象。我们想定期监控这些的内存占用。
限制/期望:
我们无法承受频繁的 GC 或这些哈希映射的完整迭代,因为这会对延迟产生负面影响。据我所知,java中没有sizeof(),所以我们可以估计。
考虑这些选项:
有一个线程通过以下方式报告每个 hashmap 的内存使用情况:
使用 classmexer 之类的工具测量 X 类型对象的大小,并将其乘以哈希图的大小。这忽略了 hashmap 本身使用的内存,假设它与其内容相比相对较小。
创建另一个 hashmap,然后添加 N 个该类型的对象,测量其大小,然后推断该数字以接近完整大小。
外部测量,然后将其提供给地图。考虑 jmap 或类似的东西,但这不会是非常繁重的操作,因为它会测量 jvm 中的所有内容吗?
当我们将对象添加到 hashmap 时,获取堆大小的增量。不确定这是否可行,因为它是多线程的
还有其他很棒的选择吗?
慕慕森
倚天杖
相关分类