master
guangxin.yuan 4 months ago
parent e372fd07b3
commit 30f3afaa3f

@ -480,7 +480,11 @@ JVM引入动态年龄计算主要基于如下两点考虑
在执行垃圾收集算法时Java应用程序的其他所有除了垃圾收集收集器线程之外的线程都被挂起。此时系统只能允许GC线程进行运行其他线程则会全部暂停等待GC线程执行完毕后才能再次运行。这些工作都是由虚拟机在后台自动发起和自动完成的是在用户不可见的情况下把用户正常工作的线程全部停下来这对于很多的应用程序尤其是那些对于实时性要求很高的程序来说是难以接受的。 在执行垃圾收集算法时Java应用程序的其他所有除了垃圾收集收集器线程之外的线程都被挂起。此时系统只能允许GC线程进行运行其他线程则会全部暂停等待GC线程执行完毕后才能再次运行。这些工作都是由虚拟机在后台自动发起和自动完成的是在用户不可见的情况下把用户正常工作的线程全部停下来这对于很多的应用程序尤其是那些对于实时性要求很高的程序来说是难以接受的。
但不是说GC必须STW,你也可以选择降低运行速度但是可以并发执行的收集算法,这取决于你的业务。 ### 如果不STW可能会出现的问题
1. 数据一致性问题: 如果不STW应用程序线程和垃圾回收线程同时运行可能会导致数据不一致。例如在垃圾回收线程正在标记对象时应用程序线程可能对对象的引用关系进行了修改。比如原本一个对象A引用对象B垃圾回收线程在标记过程中认为对象B是可回收的但应用程序线程在垃圾回收线程标记完成后又重新创建了一个引用指向对象B这就导致了垃圾回收器错误地回收了对象B而应用程序线程还在使用它从而引发错误。
2. 内存泄漏风险增加: 如果垃圾回收线程不能准确地识别存活对象可能会导致一些本应该被回收的对象没有被回收或者不该被回收的对象会被错误的垃圾回收。例如当应用程序线程在垃圾回收过程中动态地创建和销毁对象时垃圾回收线程如果没有暂停应用程序线程可能会遗漏一些已经没有引用的对象。这些对象会一直占用内存随着时间的推移可能导致内存泄漏最终使Java虚拟机的堆内存耗尽引发OutOfMemoryError错误。
3. 垃圾回收效率降低: 在并发环境中垃圾回收线程和应用程序线程的交互会变得更加复杂。垃圾回收线程需要处理应用程序线程对对象的动态修改这会增加垃圾回收的复杂性和开销。例如垃圾回收线程需要不断检查应用程序线程对对象引用的修改以确保垃圾回收的准确性。这种并发操作可能会导致垃圾回收的效率降低使得垃圾回收时间变长虽然没有STW但可能会以更频繁的垃圾回收或者更长的垃圾回收周期来弥补从而影响应用程序的整体性能。
### 垃圾回收算法 ### 垃圾回收算法
@ -926,6 +930,12 @@ Kafka最初考虑的问题是customer应该从brokes拉取消息还是brokers
3. 当两者相等则所有broker都启用吞吐达到瓶颈。 3. 当两者相等则所有broker都启用吞吐达到瓶颈。
4. 继续增加则broker会不均衡有点会分到更多的partition顺序IO退化成随机IO。 4. 继续增加则broker会不均衡有点会分到更多的partition顺序IO退化成随机IO。
### Kafka的rebalance机制
1. 消费者的再平衡是指分区的所属权从一个消费者转移到另一消费者的行为,它为消费组具备高可用性和伸缩性提供保障, 使我们可以既方便又安全地删除消费组内的消费者或往消费组内添加消费者。不过在再平衡发生期间, 消费组内的消费者是无法读取消息的。
2. 再平衡会在以下情况下被触发:消费者加入或离开消费者组,消费者心跳超时或会话过期,分区数量变化,消费者处理超时。
3. 再平衡的影响:传统再平衡会使所有消费者在再平衡期间会停止消费,直到新的分区分配完成。增量式再平衡可以让部分消费者可以继续消费未被重新分配的分区,减少停顿时间。
### Kafka中partition数量和消费者数量设置 ### Kafka中partition数量和消费者数量设置
消费者的数量不应该比分区数多,因为多出来的消费者是空闲的,没有任何帮助 消费者的数量不应该比分区数多,因为多出来的消费者是空闲的,没有任何帮助

Loading…
Cancel
Save