20 | 答疑课堂:模块三热点问题解答
20 | 答疑课堂:模块三热点问题解答
讲述:李良
时长07:11大小13.13M
使用系统命令查看上下文切换
1. Linux 命令行工具之 vmstat 命令
2. Linux 命令行工具之 pidstat 命令
3. JDK 工具之 jstack 命令
多线程队列
1. 阻塞队列
2. 非阻塞队列
赞 10
提建议
精选留言(13)
- 张德2019-07-15老师 Disruptor是不是比ConcurrentLinkedQueue性能更强呢???
作者回复: 对的,Disruptor是一款性能更高的有界队列,利用了生产者消费者模式实现,并采用无锁算法、避免伪共享、RingBuffer等优化手段提升该队列框架性能。
21 - -W.LI-2019-07-04老师好!FGC正常情况多久一次比较合适啊?我们项目1.2天一次FGC老年代给了3G年轻代1G想吧年轻代给多点。有个定时任务,2小时一次用的线程池。给了40个线程并发请求4K次。设置了空闲回收策略回收核心线程。现在就是定时任务,每次都新建40个线程一张吃老年代内存。不设置回收这些线程不实用的那个吧小时就一直阻塞。怎么处理比较合适
作者回复: GC在核心业务应用服务中越久发生越合适,且GC的时间不要太长。一般生产环境的FGC几天一次是比较正常的。40个线程是不是设置太大了,建议调小一些,当然需要你们具体压测验证下调小后的性能情况。 年轻代可以调大一些,如果年轻代太小,当MinorGC时,发现年轻代依然存活满对象,新的对象可能将无法放入到年轻代,则会通过分配担保机制提前转移年轻代的存活对象到老年代中,这样反而会增加老年代的负担。默认情况下老年代和新生代是2:1。建议没有特殊情况,不要固定设置老年代和新生代。
19 - Liam2019-07-04我有2个问题想请教老师: 1 系统出现问题时我们一般会首先关注资源的使用情况,什么情况下可能是是上下文切换过多导致的呢?CPU消耗过高? 2 ConcurrentLinkedQueue是非阻塞的,是否意味着它会消耗过多的CPu展开
作者回复: CPU消耗过高会引起上下文切换的增加,但并不代表这个就不正常了。正常情况下上下文切换在几百到几千,高峰时段会上升至几万,甚至几十万。 如果上下文长时间处于高位,这个时候我们就要注意了,这种情况有可能是某个线程长期占用CPU,例如之前我提到过的正则表达式出现的严重的回溯问题,就会在某一次回溯时,一直占用CPU,CPU的使用率高居不下,会导致上下文切换激增。 另外一种情况,就是之前你们的业务在高峰值出现的上下文切换在某个值,但是在业务迭代之后,高峰期的上下文切换的值异常高于之前的监控值。比如,我之前说的线程大小调整,导致了高峰期的上下文高出了十几倍之多。 ConcurrentLinkedQueue CAS操作会消耗CPU,但会及时释放,这不足以影响到系统的整体性能。
7 - Dowen Liu2020-03-18LinkedBlockingQueue为什么会比ArrayBlockingQueue 快?我记得ArrayBlockingQueue内部应该是循环数组的方式,没有数据搬移和复制的。
作者回复: LinkedBlockingQueue实现了读写锁分离,所以在一些场景下要比ArrayBlockingQueue快。ArrayBlockingQueue就是正常的锁实现,没有使用复制
5 - 咬你2019-07-04老师,通过vmstat参数获取的参数,可否结合一些真实场景,分析下什么样的数据范围属于正常范围,出现什么样的参数,我们就需要重点关注
作者回复: 一般系统出现性能瓶颈,可以结果上下文切换指标进行分析。在之前15讲中,我已经通过一个真实案例讲解了,可以参考下,有什么问题欢迎沟通。
2 - 徐云天2021-11-10云里雾里的:有篇文章详解了ConcurrentLinkedQueue https://www.jianshu.com/p/08e8b0c424c02
- 钱2019-09-10打卡+点赞1
- 白不吃2022-03-14CAS是不是比加锁的方案,更消耗CPU资源一些
- 书策稠浊2021-07-06一个不存储多个元素的阻塞队列,每次进行放入数据时, 必须等待相应的消费者取走数据后,才可以再次放入数据。都不存储多个了,还哪来的先进先出?
- 惘 闻2020-12-29Node t = tail, p = t; p和t都是指向的tail指向的堆空间. p.casNext 修改的是tail节点的下一个节点. 为什么修改下一个节点之后就会出现p!=t的情况呢?这俩不还是tail指向的堆内存空间吗? 我好晕啊老师...
- 惘 闻2020-12-29老师代码里的 if (p != t) 不太明白. Node t = tail, p = t; 这样的话 p不是永远都等于t吗?
- 惘 闻2020-12-29SynchronousQueue:一个不存储多个元素的阻塞队列,每次进行放入数据时, 必须等待相应的消费者取走数据后,才可以再次放入数据,该队列使用了两种模式来管理元素,一种是使用先进先出的队列,一种是使用后进先出的栈,使用哪种模式可以通过构造函数来指定。 老师这个队列就存放一个元素,先进先出还是先进后出有意义吗?1
- nightmare2019-07-04性能好是一方面,如果是抢购应用在需要用有界队列共 1 条评论