java - 奇怪的分配和字符串连接优化代码的一些描述

标签 java c++ optimization jvm jvm-hotspot

我正在审查 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 级别上,创建一个新对象是

  1. 内存分配,其次是
  2. 隐式转换为目标对象类型,然后是
  3. 调用<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/

相关文章:

mysql - SQL 多个 CASE WHEN 具有相同的 Count 函数

mysql - 即时计算用户年龄,优化。数据库

java - 如何获取点击按钮的按钮 ID?

java - 不同的异常报告

java - 将从麦克风获取的频率与已知频率进行比较

使用编译指示包和继承的 C++ 对齐

c++ - 为 C++ 代码提供单元测试

c++ - 声明 stringstream ss 之间的区别;和 std::stringstream ss;在 C++ 中?

c++ - 插入排序的快速排序代码不起作用

java - 网络 : back propogate pressure in channel handler pipeline to slow down sender