深入SpringBoot:利用Arthas排查NoSuchMethodError
前言
有時spring boot應用會遇到java.lang.NoSuchMethodError
的問題,下面以具體的demo來說明怎樣利用arthas來排查。
Demo: https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-NoSuchMethodError
在應用的main函式裡catch住異常,保證程式不退出
很多時候當應用丟擲異常後,程式退出了,就比較難排查問題。可以先改下main函式,把異常catch住:
public static void main(String[] args) throws IOException {
try {
SpringApplication.run(DemoNoSuchMethodErrorApplication.class, args);
} catch (Throwable e) {
e.printStackTrace();
}
// block
System.in.read();
}
Demo啟動之後,丟擲的異常是:
java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotationAwareOrderComparator.sort(Ljava/util/List;)V
at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:394)
at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:383)
at org.springframework.boot.SpringApplication.initialize(SpringApplication.java:249)
at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:225)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
at com.example.demoNoSuchMethodError.DemoNoSuchMethodErrorApplication.main(DemoNoSuchMethodErrorApplication.java:13)
顯然,異常的意思是AnnotationAwareOrderComparator
缺少sort(Ljava/util/List;)V
這個函式。
安裝arthas
參考:https://alibaba.github.io/arthas/install-detail.html
使用sc命令查詢類所在的jar包
應用需要丟擲了異常,但是程式還沒有退出,我們用arthas來attach上去。比如在mac下面:
./as.sh
然後選擇com.example.demoNoSuchMethodError.DemoNoSuchMethodErrorApplication
程式。
再執行sc命令來查詢類:
$ sc -d org.springframework.core.annotation.AnnotationAwareOrderComparator
class-info org.springframework.core.annotation.AnnotationAwareOrderComparator
code-source /Users/hengyunabc/.m2/repository/org/springframework/spring/2.5.6.SEC03/spring-2.5.6.SEC03.jar
name org.springframework.core.annotation.AnnotationAwareOrderComparator
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name AnnotationAwareOrderComparator
modifier public
annotation
interfaces
super-class +-org.springframework.core.OrderComparator
+-java.lang.Object
class-loader +-sun.misc.Launcher$AppClassLoader@5c647e05
+-sun.misc.Launcher$ExtClassLoader@689e3d07
classLoaderHash 5c647e05
Affect(row-cnt:1) cost in 41 ms.
可以看到AnnotationAwareOrderComparator
是從spring-2.5.6.SEC03.jar
里載入的。
使用jad檢視反編繹的原始碼
下面使用jad命令來檢視AnnotationAwareOrderComparator
的原始碼
$ jad org.springframework.core.annotation.AnnotationAwareOrderComparator
ClassLoader:
+-sun.misc.Launcher$AppClassLoader@5c647e05
+-sun.misc.Launcher$ExtClassLoader@689e3d07
Location:
/Users/hengyunabc/.m2/repository/org/springframework/spring/2.5.6.SEC03/spring-2.5.6.SEC03.jar
/*
* Decompiled with CFR 0_132.
*/
package org.springframework.core.annotation;
import java.lang.annotation.Annotation;
import org.springframework.core.OrderComparator;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
public class AnnotationAwareOrderComparator
extends OrderComparator {
protected int getOrder(Object obj) {
Order order;
if (obj instanceof Ordered) {
return ((Ordered)obj).getOrder();
}
if (obj != null && (order = obj.getClass().getAnnotation(Order.class)) != null) {
return order.value();
}
return Integer.MAX_VALUE;
}
}
Affect(row-cnt:1) cost in 286 ms.
可見,AnnotationAwareOrderComparator
的確沒有sort(Ljava/util/List;)V
函式。
排掉依賴,解決問題
從上面的排查裡,可以確定
-
AnnotationAwareOrderComparator
來自spring-2.5.6.SEC03.jar
,的確沒有sort(Ljava/util/List;)V
函式。
所以,可以檢查maven依賴,把spring 2的jar包排掉,這樣子就可以解決問題了。
總結
- 仔細看
NoSuchMethodError
的異常資訊,瞭解是什麼類缺少了什麼函式 - 利用arthas來查詢類,反編繹原始碼,確認問題
連結
相關文章
- 使用 Arthas 排查 SpringBoot 詭異耗時的 BugSpring Boot
- Arthas實踐–快速排查SpringBoot應用404/401問題Spring Boot
- 深入Spring Boot--使用Arthas排查應用404/401問題Spring Boot
- 線上問題排查神器入門——Arthas
- 深入剖析:如何使用Pulsar和Arthas高效排查訊息佇列延遲問題佇列
- Springboot:Caused by: java.lang.NoSuchMethodError...Spring BootJavaError
- 當DUBBO遇上Arthas - 排查問題的實踐
- Java線上問題排查神器Arthas實戰分析Java
- Arthas常用功能及一次線上問題排查
- Java 線上問題排查神器 Arthas 快速上手與原理淺談Java
- Java線上問題排查神器Arthas快速上手與原理淺談Java
- Arthas 實踐——生產環境排查 CPU 飈高問題
- Arthas實踐–使用redefine排查應用奇怪的日誌來源
- 應用系統瓶頸排查和分析的思考-Arthas 實戰
- 記 Arthas 實現一次 CPU 排查與程式碼熱更新
- 利用greys排查java問題Java
- 線上問題排查,一不小心踩到阿里的 arthas坑了阿里
- 【死磕JVM】用Arthas排查JVM記憶體 真爽!我從小用到大JVM記憶體
- SpringBoot Seata 死鎖問題排查Spring Boot
- SpringBoot Admin2.0 整合 Java 診斷神器 Arthas 實踐Spring BootJava
- Springboot專案啟動異常排查Spring Boot
- 利用 Arthas 精準定位 Java 應用 CPU 負載過高問題Java負載
- 利用 Arthas 解決啟動 StandbyNameNode 載入 EditLog 慢的問題
- 阿里arthas分享阿里
- SpringBoot入門及深入Spring Boot
- java 遇到NoSuchMethodError通用解決思路JavaError
- 本地安裝Arthas
- Arthas 進階教程
- 聊聊arthas的ArthasBootstrapboot
- 聊聊arthas的HttpTermServerHTTPServer
- java -- java.lang.NoSuchMethodError的問題JavaError
- Java診斷利器ArthasJava
- 我所理解的Arthas
- alibaba arthas 學習
- Arthas JVM 監控器JVM
- Arthas進階-筆記筆記
- arthas的使用入門
- 聊聊springboot自動裝配出現的TypeNotPresentExceptionProxy異常排查Spring BootException