晋升机制

支持内部晋升的无锁并发优先级线程池

蓝咒 提交于 2020-01-14 02:12:41
支持内部晋升的无锁并发优先级线程池 文章目录 支持内部晋升的无锁并发优先级线程池 引言 推导过程 如何实现优先级晋升 数据结构设计 一个指针产生的问题 任务插入指针和任务读取指针 任务插入指针如何移动 任务插入指针移动到同一位置导致的优先级任务混合问题 任务读取指针如何移动 插入和读取并发 代码实现 任务插入 任务的读取 包装为BlockQueue 效果展现 代码托管地址 引言 在技术群讨论到一个有意思的业务需求,可以描述为: 有一个内部按照优先级进行任务排序的线程池。线程池会优先执行高优先级的任务。随着时间的流逝,线程池内部低优先级的任务的优先级会逐渐晋升变为高优先级,以避免被不断新增的高优先级任务阻塞导致饿死。 考虑到 JDK 已经为开发者提供了自定义线程池 ThreadPoolExecutor 以及优先级队列 PriorityBlockingQueue ,两者相结合并且定期调整队列中低优先级任务的优先级再进行 resort 将低优先级的任务调整到队列的前头,也可以一定程度上避免被饿死。 这种方案的问题在于 resort 的消耗比较高,并且还需要重新计算每一个任务的优先级。为此,引出我们下面的设计,希望使用无锁并发的数据结构存储任务,并且任务支持自动的优先级晋升,保证低优先级的任务最终能够执行而不会被不断增加的高优先级任务饿死。 欢迎加入技术交流群186233599讨论交流

深入浅出 JVM GC(4)常用 GC 参数介绍

放肆的年华 提交于 2019-12-11 22:56:00
# 前言 从前面的3篇文章中,我们分析了5个垃圾收集器,还有一些 GC 的算法,那么,在 GC 调优中,我们肯定会先判断哪里出现的问题,然后再根据出现的问题进行调优,而调优的手段就是 JVM 提供给我们的那些参数或者说选项,这些参数将会改变 GC 的运行方式。因此,他们显得极为重要。 我们将每一个垃圾收集器相关的参数一个一个娓娓道来,注意,楼主推荐一个小程序:前阿里 JVM 大神寒泉子的公众号里面有个小程序------JVM Pocket,这个小程序介绍了所有的 JVM 参数的作用,你可以在里面搜索你想知道的参数,也可以把你了解的参数写上去供大家参考。公众号:lovestblog。 值得注意的一点是,这些参数可能会重复,还记得我们之前的那张图吗,楼主觉得有必要再发一次: 可以看到,这些收集器会有一些重复,而且,某些参数也是会作用于所有的处理器,因此,我们下面的介绍可能会有一些重复。 还有一点就是,JVM 为我们设置了很多默认的参数,但是,如果可以的话,还是建议使用显式的声明,这样更能表达意图。否则,别人不一定知道我们是否知道这些默认值。 我们开始我们的参数之旅吧! # 1. Serial 收集器参数 串行收集器,client 的默认收集器,分为年轻代 Serial 和老年代 Serial Old 收集器。 -XX:+UseSerialGC