Java jstack示例指向右括号而不是代码行

Java jstack示例指向右括号而不是代码行,java,jstack,Java,Jstack,我正在尝试调试Hadoop中的一个性能问题,作为调试的一部分,我在一些情况下从不同的Hadoop构建和运行在不同Java版本上捕获了JSTACK。当我的性能问题出现时,我会得到如下可运行线程的jstack: "DataXceiver for client DFSClient_NONMAPREDUCE_-619388227_1 at /x.x.x.x:35518 [Sending block BP-1509854702-x.x.x.x-1392815592442:blk_3738093208_11

我正在尝试调试Hadoop中的一个性能问题,作为调试的一部分,我在一些情况下从不同的Hadoop构建和运行在不同Java版本上捕获了JSTACK。当我的性能问题出现时,我会得到如下可运行线程的jstack:

"DataXceiver for client DFSClient_NONMAPREDUCE_-619388227_1 at /x.x.x.x:35518 [Sending block BP-1509854702-x.x.x.x-1392815592442:blk_3738093208_1102227094469]" daemon prio=10 tid=0x00007f1a683cf800 nid=0xb61d1 runnable [0x00007f1a36060000]
   java.lang.Thread.State: RUNNABLE
    at org.apache.hadoop.hdfs.util.FoldedTreeSet.get(FoldedTreeSet.java:449)
    at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.ReplicaMap.get(ReplicaMap.java:111)
    - locked <0x0000000751682590> (a org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl)
    at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.ReplicaMap.get(ReplicaMap.java:89)
    at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.getVolume(FsDatasetImpl.java:177)
    - locked <0x0000000751682590> (a org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl)
    at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.getVolume(FsDatasetImpl.java:127)
    at org.apache.hadoop.hdfs.server.datanode.BlockSender.<init>(BlockSender.java:283)
    at org.apache.hadoop.hdfs.server.datanode.DataXceiver.readBlock(DataXceiver.java:537)
    at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.opReadBlock(Receiver.java:148)
    at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.processOp(Receiver.java:103)
    at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:246)
    at java.lang.Thread.run(Thread.java:744)
public E removeAndGet(对象对象对象,比较器cmp){
对象。requirennull(obj);
如果(!isEmpty()){
节点=根;
while(节点!=null){
E[]条目=node.entries;
int leftIndex=node.leftIndex;
int结果=比较(obj,条目[leftIndex],cmp);
如果(结果<0){
node=node.left;
}否则如果(结果==0){
返回removeElementLeft(节点);
}否则{
int rightIndex=node.rightIndex;
如果(leftIndex!=rightIndex){
结果=比较(obj,条目[rightIndex],cmp);
}
如果(结果==0){
返回removeElementRight(节点);
}否则,如果(结果>0){
node=node.right;
}否则{
int低=左索引+1,高=右索引-1;
而(低>>1;
结果=比较(obj,条目[mid],cmp);
如果(结果>0){
低=中+1;
}否则如果(结果==0){
返回removeElementAt(节点,mid);
}否则{
高=中-1;
}
}
返回null;
}
}
}//****这是879-同样与get方法相同
}
返回null;
}

源文件中稍晚一点的代码看起来是正确的,但奇怪的是,这又指向了一个大括号。

当源代码和编译类不相同时,99%的情况下都会发生这种情况。即编译类是从不同的源(较新或较旧的版本)编译的。请尝试反编译类(product.java from.class)看看是否有帮助

我也这么认为,所以我研究了hadoop的github,这个类似乎在引入它的版本后没有被修改过,然后我会尝试反编译.class。可能他们发布的源代码不正确。添加或删除一行代码会导致这个问题。因此,发布的源代码可能会逻辑上是相同的,但包含一些或多或少的空行…是的,据我所知,这段代码基本上从未被更改过,并且该类中命中不同行的其他示例是正确的,其他类中的所有其他行也是正确的。所有这些都是使用相同的构建过程生成的。我们使用JSTACK调试hadoop问题这是我唯一一次看到这个堆栈。我会看看我是否可以反编译一个构建版本…我从jar中提取了这个类,并在Intellij中打开了这个类,但是它没有帮助,因为所有的注释都被剥离了,这个类有几个嵌套的类,所以所有的行都被移动了。但是我扫描了我的堆栈跟踪,发现这个类中的另一个方法,它有非常相似的代码,并且发生了完全相同的问题。因此,我认为这里发生了其他一些事情,而不是源代码和编译代码中的不匹配。在原始描述中添加了更多细节。
public E get(Object obj, Comparator<?> cmp) {
    Objects.requireNonNull(obj);

    Node<E> node = root;
    while (node != null) {
      E[] entries = node.entries;

      int leftIndex = node.leftIndex;
      int result = compare(obj, entries[leftIndex], cmp);
      if (result < 0) {
        node = node.left;
      } else if (result == 0) {
        return entries[leftIndex];
      } else {
        int rightIndex = node.rightIndex;
        if (leftIndex != rightIndex) {
          result = compare(obj, entries[rightIndex], cmp);
        }
        if (result == 0) {
          return entries[rightIndex];
        } else if (result > 0) {
          node = node.right;
        } else {
          int low = leftIndex + 1;
          int high = rightIndex - 1;
          while (low <= high) {
            int mid = (low + high) >>> 1;
            result = compare(obj, entries[mid], cmp);
            if (result > 0) {
              low = mid + 1;
            } else if (result < 0) {
              high = mid - 1;
            } else {
              return entries[mid];
            }
          }
          return null;
        }
      }
    } // *** This is line 449 which the jstack always has at the top of the stack.
    return null;
  }
"Thread-41" daemon prio=10 tid=0x0000000003c39000 nid=0x1c6fe1 runnable [0x00007f1a4b7b8000]
   java.lang.Thread.State: RUNNABLE
    at org.apache.hadoop.hdfs.util.FoldedTreeSet.removeAndGet(FoldedTreeSet.java:879)
    at org.apache.hadoop.hdfs.util.FoldedTreeSet.removeAndGet(FoldedTreeSet.java:892)
    at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.ReplicaMap.remove(ReplicaMap.java:162)
    - locked <0x0000000751682590> (a org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl)
    at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.invalidate(FsDatasetImpl.java:2021)
    - locked <0x0000000751682590> (a org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl)
    at org.apache.hadoop.hdfs.server.datanode.BPOfferService.processCommandFromActive(BPOfferService.java:686)
    at org.apache.hadoop.hdfs.server.datanode.BPOfferService.processCommandFromActor(BPOfferService.java:632)
    at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.processCommand(BPServiceActor.java:729)
    at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.offerService(BPServiceActor.java:539)
    at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:695)
    at java.lang.Thread.run(Thread.java:744)
  public E removeAndGet(Object obj) {
    return removeAndGet(obj, comparator); // *** This is 892, this is correct as per the stack trace above
  }
  public E removeAndGet(Object obj, Comparator<?> cmp) {
    Objects.requireNonNull(obj);

    if (!isEmpty()) {
      Node<E> node = root;
      while (node != null) {
        E[] entries = node.entries;
        int leftIndex = node.leftIndex;
        int result = compare(obj, entries[leftIndex], cmp);
        if (result < 0) {
          node = node.left;
        } else if (result == 0) {
          return removeElementLeft(node);
        } else {
          int rightIndex = node.rightIndex;
          if (leftIndex != rightIndex) {
            result = compare(obj, entries[rightIndex], cmp);
          }
          if (result == 0) {
            return removeElementRight(node);
          } else if (result > 0) {
            node = node.right;
          } else {
            int low = leftIndex + 1, high = rightIndex - 1;
            while (low <= high) {
              int mid = (low + high) >>> 1;
              result = compare(obj, entries[mid], cmp);
              if (result > 0) {
                low = mid + 1;
              } else if (result == 0) {
                return removeElementAt(node, mid);
              } else {
                high = mid - 1;
              }
            }
            return null;
          }
        }
      } // **** This is 879 - again the same as the get method
    }
    return null;
  }