2022年9月3日 作者 zeroheart

如何实现一个内存安全的队列

原文:这个队列的思路是真的好,现在它是我简历上的亮点了。 – 掘金 (juejin.cn)

此文介绍了git上一种内存安全,防止oom的队列的实现思路

按照他的思路,我们也整理下

1.看下ali的编程规约,不允许使用没有队列长度限制的实现

2.git上一个新的实现,来自dubbo

[ISSUE #10020] add MemorySafeLinkedBlockingQueue by dragon-zhang · Pull Request #10021 · apache/dubbo (github.com)

3.原有的一个实现

[ISSUE #9721] add memory limited linked blocking queue by dragon-zhang · Pull Request #9722 · apache/dubbo (github.com)

我们先说一下3这里的实现的是一个怎样的思路,具体的推荐看原文,我这里就只记录一下结论了。

Instrumentation,使用这个类来计算,当前队列中元素的近似大小,如果大小超过限制就不在允许放入新的元素了。

细节这里就不说了,原文有很多细节,博主非常细致。

我们在来看下2的实现,2的作者,说写了新的类就是为了替代3的方案的。其中不需要使用Instrumentation,我们看下他的思路。

定义一个maxFreeMemory,默认是256m,这里表示jvm的内存如果小于这个值,则不能继续添加元素了,思路是不同的,一个是考虑队列的大小,一个是考虑了jvm的情况。

另外,它说它不依赖 Instrumentation 了,那么它怎么检测内存的使用情况呢?

使用的是 ManagementFactory 里面的 MemoryMXBean

这个 MemoryMXBean 其实你一点也不陌生。

JConsole 你用过吧?

下面这个界面进去过吧?

这些信息就是从 ManagementFactory 里面拿出来的:

所以,确实它没有使用 Instrumentation,但是它使用了 ManagementFactory。

原文地下也有大神提到了,目前的实现比较简单,没有考虑gc等一些情况,这里简单摘两个图,不过这个工具类确实还是有意义的。感兴趣的去看原文。