遇到以下情况时,我正在查看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/

10-10 19:38