QIv*_*van 33 java assembly jit jvm jvm-hotspot
我得到了下面的汇编列表作为我的java程序的JIT编译的结果.
mov 0x14(%rsp),%r10d
inc %r10d
mov 0x1c(%rsp),%r8d
inc %r8d
test %eax,(%r11) ; <--- this instruction
mov (%rsp),%r9
mov 0x40(%rsp),%r14d
mov 0x18(%rsp),%r11d
mov %ebp,%r13d
mov 0x8(%rsp),%rbx
mov 0x20(%rsp),%rbp
mov 0x10(%rsp),%ecx
mov 0x28(%rsp),%rax
movzbl 0x18(%r9),%edi
movslq %r8d,%rsi
cmp 0x30(%rsp),%rsi
jge 0x00007fd3d27c4f17
Run Code Online (Sandbox Code Playgroud)
我对这test条指令的理解在这里没用,因为测试的主要思想是
标志SF,ZF,PF被修改,而AND的结果被丢弃.
这里我们不使用这些结果标志.
这是JIT中的错误还是我错过了什么?如果是,报告的最佳位置在哪里?谢谢!
Ale*_*lev 46
那必须是线程局部握手轮询.看看%r11从哪里读.如果从%r15(线程本地存储)的某个偏移量读取它,那就是那个人.看这里的例子:
0.31% ? ...70: movzbl 0x94(%r9),%r10d
0.19% ? ...78: mov 0x108(%r15),%r11 ; read the thread-local page addr
25.62% ? ...7f: add $0x1,%rbp
35.10% ? ...83: test %eax,(%r11) ; thread-local handshake poll
34.91% ? ...86: test %r10d,%r10d
? ...89: je ...70
Run Code Online (Sandbox Code Playgroud)
它没有用,一旦防护页面被标记为不可读,它就会导致SEGV,并且会将控制转移到JVM的SEGV处理程序.这是JVM安全化Java线程的机制的一部分,例如用于GC.
UPD:希望更多细节在这里.
| 归档时间: |
|
| 查看次数: |
1194 次 |
| 最近记录: |