如何更改垃圾收集线程的优先级?

这个问题是重复的是否可以更改垃圾收集器线程的优先级?

这是一个古老的问题,从那以后事情可能会发生很大的变化。 它也没有澄清一切。

是否可以更改GC线程优先级? 我见过具有不同GC线程优先级的线程转储。 如果我们无法改变它,会发生什么? 此外,我知道高频交易平台希望保持GC线程优先级非常低,以便主线程在大多数时间运行,并且“停止世界”事件不会经常发生。

简答 :线程优先级不能用于避免GC干扰应用程序线程。

答案很长:

JVM和底层操作系统不遵守 Java 线程优先级 。 这是众所周知的问题,例如由RTSJ解决。

Java线程优先级要求是:

  • 专门设计的支持Java优先级的VM ,以及
  • 一个实时操作系统

如果没有这两者,线程优先级将仅用作提示,并且不保证较高优先级线程不会被较低优先级线程抢占。

GC线程优先级由VM在创建GC线程时设置,无法从用户空间进行修改。

最后,高频交易或避免GC停止世界暂停的关键技术通常是仔细的GC调整和选择合适的GC算法 – 这两者都可以在comodity VM(例如HotspotVM)中完成。

是否可以更改GC线程优先级?

我真的认为这是错误的问题。 您不希望影响此类关键后台操作的优先级。 根据线程架构的不同,这可能会使GC线程陷入困境并导致JVM崩溃。

我认为减少GC系统使用的CPU数量的正确方法是减少对象带宽 – 减少正在创建和回收的对象数量。 您应该使用内存分析器来查看系统的哪些部分正在消耗太多内存或使用过多的临时对象。

有许多方法可以减少对象带宽:

  • 适当时更改为使用可变对象(即线程之间不共享对象的位置)
  • 清理和重用收集而不是重建它们
  • 使用StringBuilder而不是串行String追加
  • 使用slf4j type {}日志记录
  • 可能使用ThreadLocal来存储可以重置和重用的状态对象
  • 等等..

有许多方法可以减少代码的对象带宽,最终会对JVM的内存性能产生更大的影响,而不是使用后台系统线程的线程优先级。

请参阅下面的@Voo评论,但对此有一个很好的警告。