java - 如何避免 jvm 在 jvm 容器中运行编译器线程

标签 java multithreading jvm

如何避免 jvm 在 jvm 容器中运行编译器线程。

"C1 CompilerThread1" #6 daemon prio=9 os_prio=0 tid=0x00007fb2980cc000 nid=0x440e waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007fb2980be800 nid=0x440d waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

最佳答案

这些线程来自热点编译器。如果您想在线程转储中删除它们,请以 java -Xint ... 启动您的应用程序。

请注意,此后它可能会运行缓慢。 ;-)

编辑以使其清晰。禁用 JIT 编译器不是您想要做的事情。这样,字节码就会以解释模式执行,而不是为您的平台编译的代码。请参阅java options

用于演示的小片段

public class Jit {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 10_000_000; i++) {
            sb.append(' ');
        }
        long end = System.currentTimeMillis();
        System.out.println("length = " + sb.length());
        System.out.println("duration: " + (end - start));
    }
}

以混合模式运行(按需编译)

java Jit
length = 10000000
duration: 124

以解释模式运行

java -Xint Jit
length = 10000000
duration: 3495

关于java - 如何避免 jvm 在 jvm 容器中运行编译器线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35362857/

相关文章:

multithreading - 如何在执行期间使用所有处理器内核?

java - 为什么 Java 编译器 (javac) 不区分大小写,而 java(解释器)区分大小写?

java - WebSphere Application Server JVM 参数未被正确读取

java - 使用没有类描述符的静态方法

java - 如何在具有特定属性的特定元素处写入 XML 文档?

java - 是否可以通过方法引用传递参数?

java - Executor 和 PriorityBlockingQueue 上的 ASyncTask

java - 根据映射内映射的键检索值

c# - 线程携带重复的字符串对象

java - 编写单元测试(java)的最佳位置?