我想知道在使用多线程时是否绝对应该使用任何 JVM 选项?
不。
我应该配置堆吗?
不,除了将堆大小设置为合理的值(使用 -Xmx 和 -Xms)
我还应该配置 GC 吗?
不,除非您特别需要“低暂停”。如果您当前正在满足“响应性”目标,则默认吞吐量编译器是最佳选择。如果您没有达到这些目标,那么您应该考虑 CMS 或 G1 ......但要注意它们会减少暂停,但也会降低吞吐量。
我应该尽量减少垃圾收集吗?
不,这不是一个明智的目标。您的目标是最大化吞吐量,而最小化 GC 不一定能实现这一目标。在很多情况下,产生垃圾比让应用程序做额外的工作来避免产生垃圾更有效。(正如 Peter Lawrey 指出的那样,您还需要额外的开发人员来编写和维护模式复杂代码。)
我建议您使用分析器来查看您的应用程序相对于执行其他生产性工作是否花费了大量时间(CPU 时间或经过的时间)。如果没有,或者应用程序已经运行得足够快,那么不要摆弄 JVM 选项。
如果您担心您的应用程序将来无法应对增加的负载,那么调整 GC 不会扩展。更好的选择是研究扩展您的硬件和/或弄清楚如何在多台机器上完成工作。此外,调整 GC 以提高当前负载的性能实际上可能会导致负载增加时性能更差。(考虑当 CMS 无法跟上并被迫进行完整的全球范围收集以恢复时出现的问题。)
最后,拥有大量线程通常是个坏主意。最好使用少量工作线程(大致等于处理器/内核的数量)并通过并发队列等为它们提供工作。