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

时间:2014-01-18 16:22:55

标签: java multithreading performance garbage-collection

此问题与Is it possible to change the priority of garbage Collector thread?

重复

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

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

2 个答案:

答案 0 :(得分:2)

  

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

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

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

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

  • 在适当的时候改变使用可变对象(即在线程之间不共享对象的地方)
  • 清除和重用收藏而不是重建收藏
  • 使用StringBuilder而不是序列String追加
  • 使用slf4j类型{}日志记录
  • 可能使用ThreadLocal来存储可以重置和重用的状态对象
  • 等。

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

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

答案 1 :(得分:1)

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

答案很长:

JVM和底层操作系统不尊重Java 线程优先级。这是一个众所周知的问题,例如,由RTSJ。

Java线程优先级要求是:

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

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

在创建GC线程时,VM会设置

GC线程优先级,并且无法从用户空间进行修改。

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