Java jstack示例指向右括号而不是代码行
我正在尝试调试Hadoop中的一个性能问题,作为调试的一部分,我在一些情况下从不同的Hadoop构建和运行在不同Java版本上捕获了JSTACK。当我的性能问题出现时,我会得到如下可运行线程的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
"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;
}