AFAIK 当 GC 正在做它的事情时,VM 会阻塞所有正在运行的线程——或者至少在它压缩堆时。在 CLR 和 JVM (2010 年 1 月的生产版本)的现代实现中是这种情况吗?请不要提供有关 GC 的基本链接,因为我了解基本的工作原理。
我假设全局锁定是这种情况,因为当压缩发生时,引用可能在移动期间无效,并且似乎最简单的方法只是锁定整个堆(即通过阻塞所有线程间接地)。我可以想象更强大的机制,但 KISS 经常占上风。
如果我不正确,我的问题将通过对用于最小化阻塞的策略的简单解释来回答。如果我的假设是正确的,请对以下两个问题提供一些见解:
如果这确实是这种行为,那么像 JBOSS 和 Glassfish 这样的重量级企业引擎如何保持始终如一的高 TPS 率?我在 JBOSS 上进行了一些谷歌搜索,我期待在 APACHE 上找到一些适合 Web 处理的内存分配器。
面对 NUMA 式的架构(可能在不久的将来),这听起来像是一场灾难,除非进程是受线程和内存分配限制的 CPU。