2022年9月3日
如何实现一个内存安全的队列
原文:这个队列的思路是真的好,现在它是我简历上的亮点了。 – 掘金 (juejin.cn)
此文介绍了git上一种内存安全,防止oom的队列的实现思路
按照他的思路,我们也整理下
1.看下ali的编程规约,不允许使用没有队列长度限制的实现

2.git上一个新的实现,来自dubbo
3.原有的一个实现
我们先说一下3这里的实现的是一个怎样的思路,具体的推荐看原文,我这里就只记录一下结论了。
Instrumentation,使用这个类来计算,当前队列中元素的近似大小,如果大小超过限制就不在允许放入新的元素了。

我们在来看下2的实现,2的作者,说写了新的类就是为了替代3的方案的。其中不需要使用Instrumentation,我们看下他的思路。
定义一个maxFreeMemory,默认是256m,这里表示jvm的内存如果小于这个值,则不能继续添加元素了,思路是不同的,一个是考虑队列的大小,一个是考虑了jvm的情况。
另外,它说它不依赖 Instrumentation 了,那么它怎么检测内存的使用情况呢?
使用的是 ManagementFactory 里面的 MemoryMXBean。
这个 MemoryMXBean 其实你一点也不陌生。
JConsole 你用过吧?
下面这个界面进去过吧?
这些信息就是从 ManagementFactory 里面拿出来的:
所以,确实它没有使用 Instrumentation,但是它使用了 ManagementFactory。
原文地下也有大神提到了,目前的实现比较简单,没有考虑gc等一些情况,这里简单摘两个图,不过这个工具类确实还是有意义的。感兴趣的去看原文。

