C1、C2 编译器线程的默认数量根据运行应用程序的容器/设备上可用的 CPU 数量确定。下表总结了 C1、C2 编译器线程的默认数量:
|
|
|
---|---|---|
中央处理器 |
c1 线程 |
c2 线程 |
1 |
1 |
1 |
2 |
1 |
1 |
4 |
1 |
2 |
8 |
1 |
2 |
16 |
2 |
6 |
32 |
3 |
7 |
64 |
4 |
8 |
128 |
4 |
10 |
当c1和c2编译器线程消耗大量CPU时,以下是解决该问题的潜在解决方案:
如果C2编译器线程的CPU消耗只是间歇性地偏高而不是持续性的,并且这种情况并未对您的应用程序性能造成明显影响,可以考虑暂时忽略该问题。在某些情况下,临时的CPU高消耗可能是正常的,可能是因为JIT编译器正在进行优化或在应用程序启动后初始编译所致。
然而,如果这种间歇性高CPU消耗开始对应用程序的性能产生负面影响,或者频繁发生,并且持续时间较长,那么可能需要进一步调查和解决。此时,可以考虑采取一些步骤,例如监视JIT编译器的行为、分析编译日志、调整JVM参数或升级到更新的JVM版本,以寻找潜在的解决方案。
总体来说,仅当间歇性的C2编译器线程高CPU消耗并未对应用程序的整体性能产生重大影响时,暂时忽略该问题可能是一个可行的做法。但如果情况变得更加频繁或持续,可能需要更深入地调查和处理。
将 -XX:-TieredCompilation JVM参数传递给应用程序将禁用JIT(Just-In-Time)热点编译。这意味着代码将不会根据执行频率进行动态优化,从而可能降低CPU消耗。然而,需要注意的是,作为副作用,您的应用程序性能可能会受到影响,因为禁用了JIT编译会导致代码执行时不再进行实时优化。
此参数的使用是一种权衡:通过降低CPU消耗来解决高CPU消耗问题,但可能以牺牲应用程序性能为代价。因此,在使用这个参数之前,需要仔细权衡,并在实际应用程序环境中进行测试,以确保最终结果不会对应用程序的整体性能产生不可接受的影响。
当CPU峰值是由C2编译器线程单独引起时,你可以选择单独关闭C2编译。通过传递 -XX:TieredStopAtLevel=3 参数,可以实现这一目的。此参数的作用是仅启用C1编译器,同时禁用C2编译器。
这种方法可以降低CPU消耗,因为禁用C2编译器会使系统只使用较轻量级的C1编译器,但需要注意的是,这可能会影响到应用程序的性能。
在使用此参数之前,建议进行详尽测试,以确保对应用程序性能的影响在可接受范围内。选择禁用C2编译器应慎重考虑,因为可能会牺牲应用程序的性能优化能力。
编译分为四层:
|
|
---|---|
编译级别 |
描述 |
0 |
解释代码 |
1 |
简单的c1编译代码 |
2 |
有限的c1编译代码 |
3 |
完整的c1编译代码 |
4 |
C2编译代码 |
-XX:+PrintCompilation 是一个非常有用的JVM参数。通过传递此参数给您的应用程序,JVM将会打印有关应用程序编译过程的详细信息,这可以帮助你更好地了解代码的实际编译情况。
打印编译信息可以提供有关哪些方法被编译、何时被编译以及使用了哪种类型的编译器(比如C1或C2)等方面的详细信息。这对于调整和优化应用程序的性能非常有帮助,因为您可以通过查看输出信息来了解编译器在何处花费时间,从而有针对性地进行优化。
但需要注意的是,输出的信息可能会非常详细和庞大,可能会对系统性能产生一定的影响。因此,在生产环境中使用此参数时要小心谨慎,并且最好在测试环境中进行尝试和调整,以避免对实际应用程序的性能产生不必要的负面影响。
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!