gpt4 book ai didi

java - 对于同一个方法,JVM如何决定使用哪个nmethod

转载 作者:行者123 更新时间:2023-12-02 01:21:11 25 4
gpt4 key购买 nike

据我所知,JIT编译的机器代码存储在nmethod中。当osr发生时,整个方法也会被编译,而不仅仅是循环部分。因此,同一个方法可能有多个nmethod(osr或方法编译)。下次执行该方法时,按照什么选择nmethod?

我运行一个 tomcat 应用程序并打开 JVM 标志 -XX:+PrintTieredEvents。发现方法“org.apache.coyote.AbstractProcessor.parseHost”始终被编译,并且其运行级别为0(解释器执行),就好像没有使用nmethod一样。

399.895003: [loop level=0 [org.apache.coyote.AbstractProcessor.parseHost(Lorg/apache/tomcat/util/buf/MessageBytes;)V] @190 queues=0,0 rate=0.946396 k=1.00,1.00 total=1684,79876 mdo=1538(0),77824(0) max levels=4,4 compilable=c1,c1-osr,c2,c2-osr status=idle]
399.895053: [compile level=4 [org.apache.coyote.AbstractProcessor.parseHost(Lorg/apache/tomcat/util/buf/MessageBytes;)V] @190 queues=0,0 rate=0.946396 k=1.00,1.00]

401.924422: [loop level=0 [org.apache.coyote.AbstractProcessor.parseHost(Lorg/apache/tomcat/util/buf/MessageBytes;)V] @190 queues=0,0 rate=1.021956 k=1.00,1.00 total=1684,81924 mdo=1538(0),79872(0) max levels=4,4 compilable=c1,c1-osr,c2,c2-osr status=idle]
401.924488: [compile level=4 [org.apache.coyote.AbstractProcessor.parseHost(Lorg/apache/tomcat/util/buf/MessageBytes;)V] @190 queues=0,0 rate=1.021956 k=1.00,1.00]

402.915345: [loop level=0 [org.apache.coyote.AbstractProcessor.parseHost(Lorg/apache/tomcat/util/buf/MessageBytes;)V] @190 queues=0,0 rate=0.996109 k=1.00,1.00 total=1684,82948 mdo=1538(0),80896(0) max levels=4,4 compilable=c1,c1-osr,c2,c2-osr status=idle]
402.915398: [compile level=4 [org.apache.coyote.AbstractProcessor.parseHost(Lorg/apache/tomcat/util/buf/MessageBytes;)V] @190 queues=0,0 rate=0.996109 k=1.00,1.00]

我转储方法的 nmethods

address:0x00007f43cb17ce50 || size:2400 || methodName:NMethod for org/apache/coyote/AbstractProcessor.parseHost(Lorg/apache/tomcat/util/buf/MessageBytes;)V || isOSR:true || lockedByVm:false || _entry_bci:190|| _state:0|| _exception_offset:1680|| _deoptimize_offset:1685|| _deoptimize_mh_offset:-1|| _orig_pc_offset:64|| _stub_offset:1680|| _consts_offset:368|| _oops_offset:1704|| _metadata_offset:1712|| _scopes_data_offset:1760|| _scopes_pcs_offset:2152|| _dependencies_offset:2344|| _handler_table_offset:2352|| _nul_chk_table_offset:2352|| _nmethod_end_offset:2400|| _stack_traversal_mark:0|| _compile_id:19658|| _comp_level:4|| _marked_for_deoptimization:0|| _entry_point:0x00007f43cb17cfc0|| _verified_entry_point:0x00007f43cb17cfc0|| _osr_entry_point:0x00007f43cb17cfd0

address:0x00007f43cb1813d0 || size:10152 || methodName:NMethod for org/apache/coyote/AbstractProcessor.parseHost(Lorg/apache/tomcat/util/buf/MessageBytes;)V || isOSR:false || lockedByVm:false || _entry_bci:-1|| _state:0|| _exception_offset:6235|| _deoptimize_offset:6240|| _deoptimize_mh_offset:-1|| _orig_pc_offset:64|| _stub_offset:6160|| _consts_offset:592|| _oops_offset:6256|| _metadata_offset:6296|| _scopes_data_offset:6520|| _scopes_pcs_offset:9040|| _dependencies_offset:9808|| _handler_table_offset:9848|| _nul_chk_table_offset:10040|| _nmethod_end_offset:10152|| _stack_traversal_mark:0|| _compile_id:25500|| _comp_level:4|| _marked_for_deoptimization:0|| _entry_point:0x00007f43cb181620|| _verified_entry_point:0x00007f43cb181640||_osr_entry_point:0x00007f43cb181620

address:0x00007f43cd81fc50 || size:20000 || methodName:NMethod for org/apache/coyote/AbstractProcessor.parseHost(Lorg/apache/tomcat/util/buf/MessageBytes;)V || isOSR:true || lockedByVm:false || _entry_bci:105|| _state:0|| _exception_offset:13508|| _deoptimize_offset:13632|| _deoptimize_mh_offset:-1|| _orig_pc_offset:328|| _stub_offset:13168|| _consts_offset:1104|| _oops_offset:13656|| _metadata_offset:13704|| _scopes_data_offset:13888|| _scopes_pcs_offset:17584|| _dependencies_offset:19168|| _handler_table_offset:19192|| _nul_chk_table_offset:19720|| _nmethod_end_offset:20000|| _stack_traversal_mark:0|| _compile_id:25194|| _comp_level:3|| _marked_for_deoptimization:0|| _entry_point:0x00007f43cd8200a0|| _verified_entry_point:0x00007f43cd8200c0|| _osr_entry_point:0x00007f43cd82287b

最佳答案

每个nmethod都有_entry_bci - 该nmethod可以开始执行的字节码索引。非 OSR 编译具有 _entry_bci == InitationEntryBci (-1)

为栈上替换 (OSR) 编译的方法永远不会重用于常规方法条目。

事实上,一个 Java 方法最多可能有一个实际的 compiled entry point (不包括 OSR 和 AOT 条目)。如果在更高层重新编译某个方法,则该条目将被替换为指向新代码,并且以前的 nmethods 会被标记为 not_entrant,尽管当前 Activity 的框架可能会继续运行旧版本。

关于java - 对于同一个方法,JVM如何决定使用哪个nmethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57652814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com