Skip to content

Commit 30f3afa

Browse files
author
guangxin.yuan
committed
update
1 parent e372fd0 commit 30f3afa

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

Rocket.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,11 @@ JVM引入动态年龄计算,主要基于如下两点考虑:
480480

481481
在执行垃圾收集算法时,Java应用程序的其他所有除了垃圾收集收集器线程之外的线程都被挂起。此时,系统只能允许GC线程进行运行,其他线程则会全部暂停,等待GC线程执行完毕后才能再次运行。这些工作都是由虚拟机在后台自动发起和自动完成的,是在用户不可见的情况下把用户正常工作的线程全部停下来,这对于很多的应用程序,尤其是那些对于实时性要求很高的程序来说是难以接受的。
482482

483-
但不是说GC必须STW,你也可以选择降低运行速度但是可以并发执行的收集算法,这取决于你的业务。
483+
### 如果不STW可能会出现的问题
484+
485+
1. 数据一致性问题: 如果不STW,应用程序线程和垃圾回收线程同时运行,可能会导致数据不一致。例如,在垃圾回收线程正在标记对象时,应用程序线程可能对对象的引用关系进行了修改。比如原本一个对象A引用对象B,垃圾回收线程在标记过程中认为对象B是可回收的,但应用程序线程在垃圾回收线程标记完成后,又重新创建了一个引用指向对象B,这就导致了垃圾回收器错误地回收了对象B,而应用程序线程还在使用它,从而引发错误。
486+
2. 内存泄漏风险增加: 如果垃圾回收线程不能准确地识别存活对象,可能会导致一些本应该被回收的对象没有被回收或者不该被回收的对象会被错误的垃圾回收。例如,当应用程序线程在垃圾回收过程中动态地创建和销毁对象时,垃圾回收线程如果没有暂停应用程序线程,可能会遗漏一些已经没有引用的对象。这些对象会一直占用内存,随着时间的推移,可能导致内存泄漏,最终使Java虚拟机的堆内存耗尽,引发OutOfMemoryError错误。
487+
3. 垃圾回收效率降低: 在并发环境中,垃圾回收线程和应用程序线程的交互会变得更加复杂。垃圾回收线程需要处理应用程序线程对对象的动态修改,这会增加垃圾回收的复杂性和开销。例如,垃圾回收线程需要不断检查应用程序线程对对象引用的修改,以确保垃圾回收的准确性。这种并发操作可能会导致垃圾回收的效率降低,使得垃圾回收时间变长,虽然没有STW,但可能会以更频繁的垃圾回收或者更长的垃圾回收周期来弥补,从而影响应用程序的整体性能。
484488

485489
### 垃圾回收算法
486490

@@ -926,6 +930,12 @@ Kafka最初考虑的问题是,customer应该从brokes拉取消息还是brokers
926930
3. 当两者相等,则所有broker都启用,吞吐达到瓶颈。
927931
4. 继续增加,则broker会不均衡,有点会分到更多的partition,顺序IO退化成随机IO。
928932

933+
### Kafka的rebalance机制
934+
935+
1. 消费者的再平衡是指分区的所属权从一个消费者转移到另一消费者的行为,它为消费组具备高可用性和伸缩性提供保障, 使我们可以既方便又安全地删除消费组内的消费者或往消费组内添加消费者。不过在再平衡发生期间, 消费组内的消费者是无法读取消息的。
936+
2. 再平衡会在以下情况下被触发:消费者加入或离开消费者组,消费者心跳超时或会话过期,分区数量变化,消费者处理超时。
937+
3. 再平衡的影响:传统再平衡会使所有消费者在再平衡期间会停止消费,直到新的分区分配完成。增量式再平衡可以让部分消费者可以继续消费未被重新分配的分区,减少停顿时间。
938+
929939
### Kafka中partition数量和消费者数量设置
930940

931941
消费者的数量不应该比分区数多,因为多出来的消费者是空闲的,没有任何帮助

0 commit comments

Comments
 (0)