2014-01-18 56 views
1

这个问题是重复的Is it possible to change the priority of garbage Collector thread?如何更改垃圾回收线程的优先级?

这是一个古老的问题,事情可能自那时起改变了很多。也没有说明一切。

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

回答

1

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

龙答:

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

Java线程优先级要求是:

  • 专门设计的VM支持Java的优先事项,并
  • 实时OS

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

GC线程优先级是由VM在创建GC线程时设置的,不能从用户空间修改。对于高频率交易或避免GC停止世界暂停一般是仔细的GC调整和选择适当的GC算法 - 这两个都可以在一个comodity虚拟机中完成(如HotspotVM)。

2

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

我真的认为这是错了的问题。您不希望影响此类关键后台操作的优先级。根据线程体系结构的不同,这可能导致GC线程挨饿并导致JVM失效。

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

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

  • 改变使用可变对象在适当的时候(即,其中所述对象未线程之间共享)
  • 清算和重用集合,而不是重建他们
  • 使用StringBuilder而不是串行String使用SLF4J型{}记录追加
  • 可能使用ThreadLocal存储状态的对象,可以重新再利用
  • 等。

有许多方法来减少你的代码的对象带宽,最终将会对内存性能更影响而不是使用后台系统线程的线程优先级进行播放。

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

+2

虽然在这方面“优化”的时候最好*非常小心。举一个例子:短命的小对象是GC调用的东西,因此引入对象池来重用对象通常会导致现代JVM上的性能下降(特别是延迟)。年轻的GCs真的很便宜! – Voo

+0

有点赞同@Voo。我不确定使用对象池会不会导致更糟糕的性能(除非它实施得不好或需要同步锁或其他东西),但它肯定会意味着更多的代码,而不会改进性能。 – Gray

+0

谢谢。在那种情况下,线程转储中GC线程的优先级不同是因为JVM决定为不同的应用程序设置不同的优先级? –