当前位置: 首页 > 面试题库 >

java PrintCompilation输出:“不进入”和“僵尸”的含义是什么

裘禄
2023-03-14
问题内容

运行Java
1.6(1.6.0_03-b05)应用程序时,我添加了该-XX:+PrintCompilation标志。在某些方法的输出上,尤其是我所知道的一些方法被称为很多,我看到了文本made not entrantmade 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]

问题答案:

我已经在自己的博客上整理了一些相关信息。我发现的Cliff Click评论说:

僵尸方法是通过类加载使其代码无效的方法。通常,服务器编译器会针对非最终方法做出积极的内联决策。只要内联方法永远不会被覆盖,代码就是正确的。当子类被加载并且方法被重写时,编译后的代码将为以后的所有调用而中断。该代码被声明为“不可进入”(将来的调用者不再调用该损坏的代码),但是有时现有的调用者可以继续使用该代码。就内联而言,这还不够好;现有调用者的堆栈帧从嵌套调用返回到代码时(或仅在代码中运行时)被“优化”。如果没有更多的堆栈框架将PC固定在已损坏的代码中,则将其声明为“僵尸”-一旦GC解决了该问题,便可以将其删除。



 类似资料:
  • 僵尸进程 当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。 一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。 理解了孤儿进程和僵尸进程,我们临时加了守护进程这一小节,守护进程就是后台进程吗?没那么简单。

  • 问题内容: 维基百科说:“一个终止但从未被其父级等待的子进程变成了僵尸进程。” 我运行此程序: 这会创建一个僵尸进程,但我不明白为什么在这里创建了僵尸进程? 该程序的输出是 但是在这种情况下,为什么“子进程终止但没有被其父进程等待”呢? 问题答案: 在您的代码中,创建了僵尸(带有以下箭头的注释): 为什么?因为你从来没有上过。调用时,它将返回有关进程的事后信息,例如其退出代码。不幸的是,当进程退出

  • 僵尸增量是一款放置游戏,你需要控制一群僵尸破坏小镇...

  • 问题内容: 我在前台启动了我的程序(守护程序),然后用杀死了它,但剩下一个僵尸,无法用杀死它。如何杀死僵尸进程? 如果僵尸是一个死进程(已被杀死),我如何将其从输出中删除? 问题答案: 僵尸已经死了,所以您无法杀死它。要清理僵尸,必须等待其父级等待,因此杀死父级应该可以消除僵尸。(父对象死后,僵尸将被pid 1继承,而pid 1将等待该僵尸并清除其在进程表中的条目。)如果守护程序正在生成成为僵尸的

  • 问题内容: 我在Go中有一个应用程序,它可以重新路由二进制文件的STDIN和STDOUT,然后运行它们。简而言之,我正在做: 我注意到,只要在运行命令A时退出命令B的进程,它就会在进程表中变成僵尸进程。 这是一个例子: 如果commandB仍在运行时退出,为什么commandB会变成僵尸?我在Ubuntu 14上运行Go 1.5。 问题答案: 当某个进程退出时,无论正在运行什么其他进程,它 总是

  • 什么是不可中断状态 当 iowait 升高时,进程很可能因为得不到硬件的响应,而长时间处于不可中断状态。从 ps 或者 top 命令的输出中,可以发现它们都处于 D 状态,也就是不可中断状态 (Uninterruptible Sleep)。 不可中断状态,表示进程正在跟硬件交互,为了保护进程数据和硬件的一致性,系统不允许其他进程或中断打断这个进程。进程长时间处于不可中断状态,通常表示系统有 I/O