Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java打印编译输出:what';“的意思是什么;“不得进入”;及;“制造僵尸”;_Java_Jit_Jvm Hotspot - Fatal编程技术网

java打印编译输出:what';“的意思是什么;“不得进入”;及;“制造僵尸”;

java打印编译输出:what';“的意思是什么;“不得进入”;及;“制造僵尸”;,java,jit,jvm-hotspot,Java,Jit,Jvm Hotspot,在运行Java 1.6(1.6.0_03-b05)应用程序时,我添加了-XX:+printcomployment标志。在一些方法的输出上,特别是我知道的一些方法经常被调用,我看到文本made not entrant和made zombie 这些是什么意思?最好的猜测是,在重新编译该方法或具有更高优化的依赖项之前,这是一个反编译步骤。这是真的吗?为什么是“僵尸”和“进入者” 例如,其中一些行之间有相当长的时间: [... near the beginning] 42 jsr166y.L

在运行Java 1.6(1.6.0_03-b05)应用程序时,我添加了
-XX:+printcomployment
标志。在一些方法的输出上,特别是我知道的一些方法经常被调用,我看到文本
made not entrant
made zombie

这些是什么意思?最好的猜测是,在重新编译该方法或具有更高优化的依赖项之前,这是一个反编译步骤。这是真的吗?为什么是“僵尸”和“进入者”

例如,其中一些行之间有相当长的时间:

[... near the beginning]
42       jsr166y.LinkedTransferQueue::xfer (294 bytes)

[... much later]
42    made not entrant  jsr166y.LinkedTransferQueue::xfer (294 bytes)
---   n   sun.misc.Unsafe::compareAndSwapObject
170       jsr166y.LinkedTransferQueue::xfer (294 bytes)
170   made not entrant  jsr166y.LinkedTransferQueue::xfer (294 bytes)
  4%      jsr166y.LinkedTransferQueue::xfer @ 29 (294 bytes)
171       jsr166y.LinkedTransferQueue::xfer (294 bytes)

[... even later]
42    made zombie  jsr166y.LinkedTransferQueue::xfer (294 bytes)
170   made zombie  jsr166y.LinkedTransferQueue::xfer (294 bytes)
171   made not entrant  jsr166y.LinkedTransferQueue::xfer (294 bytes)
172       jsr166y.LinkedTransferQueue::xfer (294 bytes)

[... no further logs]

这对我来说绝对不是一个专业领域,但我很感兴趣,所以做了一些挖掘

您可能会发现一些有趣的链接:

nmethod.hpp
的摘录:

// Make the nmethod non entrant. The nmethod will continue to be
// alive.  It is used when an uncommon trap happens.  Returns true
// if this thread changed the state of the nmethod or false if
// another thread performed the transition.
bool  make_not_entrant() { return make_not_entrant_or_zombie(not_entrant); }
//...

作为一个起点。

我已经收集了一些关于这方面的信息。我找到的一条点击悬崖的评论说:

僵尸方法是其代码因类加载而无效的方法。通常,服务器编译器会对非final方法做出积极的内联决策。只要内联方法从未被重写,代码就是正确的。当加载一个子类并重写该方法时,编译后的代码将被中断,以便将来调用它。代码被声明为“not entrant”(没有被破坏代码的未来调用方),但有时现有调用方可以继续使用代码。在内联的情况下,这还不够好;当现有调用方从嵌套调用返回到代码时(或者仅当它们在代码中运行时),它们的堆栈帧将被“去优化”。当没有更多的堆栈帧将PC放入损坏的代码中时,它就被声明为“僵尸”——一旦GC找到它,它就可以被删除

printcomployment
上有大量令人难以置信的信息。具体来说,它说:

当发生非优化时,如果决定使违规的
n方法无效
,将首先“使其成为非参赛者”;然后,当
NMethodSweeper
发现堆栈上不再有对它的激活时,它就变成了“僵尸”


更新的解释是,日志中可能有如下条目:

129   72       3       EscapeAnalysysTest::second (24 bytes)
.......... some more lines
135   76       4       EscapeAnalysysTest::second (24 bytes)
137   74       3       EscapeAnalysysTest::second (24 bytes)   made not entrant

这实际上意味着一种方法(
second
此处)已在下编译,然后在层级别
4
下进行了进一步优化,并使其不再进入三维层;这意味着它将被第4层的代码替换。

这是一个有用的开始,谢谢。我对代码看得越多,发现自己不知道的热点词汇就越多!那么,我们是否认为“not_entrant”仅仅意味着“不再执行此编译代码,需要先取消选择/重新编译”?另一个链接:参见第536行“entrant”的含义,我猜它会标记编译后的方法不再被输入(尽管有些线程可能仍然在其中),而zombie意味着它没有进一步的用途,可以被丢弃。就像收银台可以宣布它不接受新客户(非进入者),但在关闭收银台(僵尸)之前仍必须为排队的客户提供服务一样。但这只是一个猜测。Kris Mok给JodaStephen写了一封回信,该回信现在已经从他的博客链接到了JodaStephen的博客上,在对-XX:+编译的描述中更加完整;这里是链接:你能告诉我这个解释的来源吗?@merovingienne这是我在阅读jvm源代码时记得的,我现在不记得确切的路径了…@merovingienne你可以在Douglas Hawkins的演讲中找到关于Java JIT的非常有用的信息:。他在20:30解释说“不得进入”。