成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

類加載常見錯誤總結,寫得非常好!

開發 后端
最近在做類隔離相關的一些工作,而恰恰之前協助開發同學時也發現會遇到許多類加載相關的異常,并且往往比較難定位與解決。這里簡單做一個小總結。

[[397161]]

最近在做類隔離相關的一些工作,而恰恰之前協助開發同學時也發現會遇到許多類加載相關的異常,并且往往比較難定位與解決。這里簡單做一個小總結。

類加載

首先我們來捋一捋類加載的基礎知識。

以上是大家比較熟悉的類加載器模型,主要包含 3 種類加載器:

  •  BootstrapClassloader 根加載器,也就是系統類加載器,加載核心庫,如 rt.jar。
  •  ExtensionClassloader 擴展類加載器,主要加載/ext/下面的 jar 包
  •  AppClassloader 離我們最近的類加載器,負責加載 classpath 下的類,開發時候我們的代碼大部分由其加載。

此外我們比較需要知道的幾點:

  •  一個類是由 jvm 加載是通過類加載器+全限定類名確定唯一性的。
  •  雙親委派,眾所周知,子加載器會盡量委托給父加載器進行加載,父加載器找不到再自己加載
  •  線程上下文類加載,為了滿足 spi 等需求突破雙親委派機制,當高層類加載器想加載底層類時通過 Thread.contextClassLoader 來獲取當前線程的類加載器(往往是底層類加載器)去加載類。

ClassNotFoundException

ClassNotFoundException 表示類找不到異常,是一種 Exception,通常發生在載入階段,當開發者主動調用 Class.forName()、ClassLoader.loadClass()或 ClassLoader.findSystemClass()動態加載指定類時候,類加載器就會去 classpath 下尋找類,如果找不到就會拋出此錯誤。

還有另外一種情況是當一個類已經被某個類加載器加載到內存中,另外一個類加載器試圖去加載時也會發生錯誤。

ClassNotFoundException 是一個 exception 類,同時發生在主動執行動態加載時,所以我們應該去 catch 它,防止發生一些運行時錯誤。另外,關注公眾號Java技術棧,在后臺回復:JVM46,可以獲取一份 46 頁的 JVM 高清教程,非常齊全。

NoClassDefFoundError

NoClassDefFoundError 是一種和 ClassNotFoundException 很像的錯誤,只不過它是更嚴重的 error 類型。它發生在鏈接階段,表示 jvm 在編譯階段可以找到相應的類,但在執行過程中卻找不到相應的類。

一種原因是由于在編譯后運行前類被更改或者刪除了。另外一種則是 classpath 本身被修改過了,這可以通過System.getProperty("java.classpath")來找到程序實際運行的 classpath,或者通過-classpath 命令來指定正確的 classpath。

那如果是在 ide 中開發,很多時候出現的情況是我們可以通過 ide 編譯通過,但在實際運行的 WEB-INF/lib 下卻是沒有的。所以排查的時候我們需要去實際的 war 包下面確定是否有類。

NoSuchMethodError

我們還會遇到 NoSuchMethodError 錯誤,它表示找不到方法,但找不到方法歸根結底是找到了不正確的類。

通常情況下是因為 jar 包沖突問題,即加載了不匹配版本的類導致的。例如應用中有 A、B 兩個二方包,A 依賴 C-v1 包,而 B 依賴 C-v2 包,如果 maven 仲裁最后使用的是 C-v1 包,那么當 B 加載到 C-v2 中有而 C-v1 中沒有的方法時就會報 NoSuchMethodError。

這種情況我們首先得知道 jvm 到底加載的是什么版本,這可以使用-verbose:class來確定。Java 系列教程及實踐源碼:https://github.com/javastacks/javastack

LinkageError

LinkageError 相比較之前幾種錯誤不那么常見,只有多個類加載器同時作用交互時才會出現。另外,關注公眾號Java技術棧,在后臺回復:面試,可以獲取我整理的 JVM 系列面試題和答案,非常齊全。

我們知道 jvm 中一個類由全限定類名與類加載器確定類實例,那么不同類加載器加載的同一個類是屬于不同類實例的,然后在內存中如果兩者發生交互,就會出現 LinkageError 異常。

一般情況下,jvm 加載類都會遵循之前所述的雙親委派原則,不太可能出現一個類有不同類加載器加載的情況。但在諸如 tomcat 之類的 javaEE 環境中,常常出這種狀況,這是由于 tomcat 上的 web 應用類加載機制稍有不同,每個資源模塊(比如一個 war 包)都優先使用自身的資源,突破了雙親委派模型:

當 appClassLoader 加載類時候,會首先在自己的本地資源庫中查找類,其次才會走雙親委派模型。那么如果一個類 A 由 AppClassLoaderx 加載,但其超類在 AppClassLoader 中沒有,只有委托 CommonClassLoader 才能找到,當類 A 與其超類進行交互時就會報錯了。

還有一種比較常見的情況是進行自定義類加載器開發時遇到。比如開發類隔離容器時,期望將某些中間件都由與應用不同的獨立類加載器加載,但這時候如果中間件依賴 spring context,而應用本身也依賴 spring context,那么 作為 spring bean 交互時候就會妥妥報 LinkageError 了。Spring Boot 系列教程推薦:https://github.com/javastacks/spring-boot-best-practice

解決這個問題的辦法包括 2 種,即控制不同類加載器加載的類不進行交互,或者都交于一個共同的父加載器進行加載。

Some Tips

總結一下以上幾種錯誤。ClassNotFoundException 以及 NoClassDefFoundError 都是由于加載不到類導致的,而 NoSuchMethodError 是因為加載了不正確的類,LinkageError 則是由于同一個類被多個類加載器加載所導致的。

以上這些問題都可以使用arthas進行排查。例如使用 sc 命令來查看 JVM 已加載的類信息,包括從哪個 jar 包讀取,由哪個類加載器加載。使用 jad 命令來查看 jvm 中反編譯的代碼,可以定位到底到底有沒有所需 method。以及使用 classloader 命令,來查看當前所有 classloader 的信息,包括加載的 urls,是否能加載到指定的類或者 resources 等。 

 

責任編輯:龐桂玉 來源: Java技術棧
相關推薦

2021-03-04 09:20:20

數據Redis 架構

2019-07-31 11:10:59

Java流程圖框架

2020-12-14 09:55:17

Redis數據庫命令

2021-06-25 10:35:58

分布式代碼Java

2009-11-09 09:09:42

Windows 7市場銷售

2023-11-03 14:50:14

2009-04-08 08:50:17

Windows 7微軟操作系統

2021-03-15 09:27:05

Redis優化技術

2009-12-31 10:02:06

Ubuntu VMwa

2012-05-15 09:35:43

jQuery

2019-04-28 11:01:05

云安全云計算CASB

2021-01-04 20:48:19

TypeScriptJS前端

2011-05-17 09:51:27

Div+CSS

2010-08-24 10:32:34

DIV+CSS

2010-08-27 14:05:40

DIV+CSS

2018-10-08 14:35:01

Linux游戲教育軟件

2009-12-09 13:11:03

PHP框架常見錯誤

2023-08-23 15:57:41

開發工具Java

2022-07-10 00:01:43

漏洞工具安全

2021-08-29 07:48:16

Golang開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 老司机精品福利视频 | 激情欧美一区二区三区中文字幕 | 黄色三级免费网站 | 国产精品久久久久免费 | 亚洲网站在线观看 | 中文字幕一区二区三区精彩视频 | 国产精品国产三级国产aⅴ中文 | 成人在线精品 | 日韩欧美在线一区 | 成人视屏在线观看 | 99热热热热 | 国产欧美一区二区久久性色99 | 91在线网站| 国产区在线看 | 日韩国产欧美在线观看 | 午夜精品久久久久久久99黑人 | 久久亚洲一区二区三区四区 | 成人精品视频在线 | 久久中文字幕av | 免费观看视频www | 欧美一级淫片免费视频黄 | 在线播放国产一区二区三区 | 最新国产精品精品视频 | 亚洲精品久久久 | 亚洲成人免费视频 | 一区二区免费 | 成人影院一区二区三区 | 免费午夜视频在线观看 | 中文字幕在线免费视频 | 999www视频免费观看 | 亚洲最色视频 | 热re99久久精品国99热观看 | 国产精品久久国产精品久久 | 国产精品网页 | 久久精品国产亚洲一区二区三区 | 中文字幕成人 | 欧美无乱码久久久免费午夜一区 | 免费国产视频 | 不卡av电影在线播放 | 久久久久久久av麻豆果冻 | 国产免费a |