遇到以下情况时,我正在查看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
是某种类型的对象表示形式,用于调用加号“ +”(用于String串联)。现在,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/