我正在审查 OpenJDK JVM 的 String concatentation optimization code当我遇到以下情况时:
cnode = recv->isa_CallStaticJava();
if (cnode == NULL) {
alloc = recv->isa_Allocate();
if (alloc == NULL) {
break;
}
// Find the constructor call
Node* result = alloc->result_cast();
if (result == NULL || !result->is_CheckCastPP() || alloc->in(TypeFunc::Memory)->is_top()) {
// strange looking allocation
#ifndef PRODUCT
if (PrintOptimizeStringConcat) {
tty->print("giving up because allocation looks strange ");
alloc->jvms()->dump_spec(tty); tty->cr();
}
#endif
break;
}
首先,我不确定什么是cnode
。我在想 cnode
是某种类型的对象表示,用于调用加号“+”(用于字符串连接)。现在,result
是对加号对应的 StringBuilder
构造函数的调用。好的,再次不确定,但我认为如果没有创建节点或者节点不是 CheckCastPP 或者创建分配的对象表示在堆栈顶部,优化将不会继续。
什么是 CheckCastPP,我的解释是否正确?
最佳答案
您正在查看的函数 - PhaseStringOpts::build_candidate(CallStaticJavaNode* call)
- 从 StringBuilder.toString()
开始调用节点并尝试展开使用链以寻找典型的串联模式:
StringBuilder AllocateNode -> append() CallStaticJavaNode -> ... -> toString()
您显示的片段检查链中当前节点的类型。如果是CallStaticJavaNode
, 那么它应该是对 StringBuilder.append()
的调用, 否则应该是 AllocateNode
.
在 JVM 级别上,创建一个新对象是
- 内存分配,其次是
- 隐式转换为目标对象类型,然后是
- 调用
<init>
方法(构造函数)
对于正确生成的字节码
new java/lang/StringBuilder
dup
invokespecial java/lang/StringBuilder.<init>()V
AllocNode
只会出现一次将结果转换为 StringBuilder
.
这就是result->is_CheckCastPP()
断言。
关于java - 奇怪的分配和字符串连接优化代码的一些描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25563706/