背景
在測試環境的系統,一個功能突然無法使用了,於是開始翻找日誌,加上做實時的測試,在日誌中發現瞭如下的錯誤:
Invalid use of BasicClientConnManager: connection still allocated
然後下面的信息略過,在網上查了查,發現是http連接出現的問題,多發生於rest調用還有httpclient接收請求時候的連接沒有釋放,所以,我決定在本地調試一下httputil,看看裏面是不是有其他的問題導致了這個錯誤的發生。
連接:https://blog.csdn.net/earthhour/article/details/43406409
然而,當我在本地用debug方式啓動了之後,在調用的時候卻又出現了另外一個問題:
java.lang.NoClassDefFoundError
然後在網上查了查,發現其原因更加的離譜,爲java虛擬機在運行的時候不能找到合適的類,然後出現了無法繼續運行的問題,因爲之前沒有遇到過,所以一頭霧水,但是是因爲找不到合適的類,所以我在webroot下面找到了lib文件夾,然後查看引入的jar包,發現了之前做實驗的時候有沒有刪除的版本的jar包:
由於發送http請求的工具jar包重複了,所以在編輯後可能出現找不到正確jar包的時候。
由於原來用的是舊版本的jar包,所以把新版本的jar包刪除之後,兩個錯誤就同時消失了。
詢因
因爲在做實驗的時候,添加完成jar包之後,在debug下並沒有出現此錯誤,所以我就忽略了重複功能jar包的依賴不可能性,因爲在編譯的時候也沒有出現異常情況,所以覺得根本沒有問題。但是在運行時候就出現了貓膩。
詳細查詢之後發現瞭如下的文章:https://www.cnblogs.com/xyhz0310/p/6803950.html
然後瞭解了其實還有一種異常是:ClassNotFoundException
看似和上述的第二個錯誤一樣,但是差別是很大的,
1、NoClassDefFoundError是在編譯完成之後,運行中java虛擬機在classpath下沒有找到需要的類名的時候包的錯。
2、ClassNotFoundException是在編譯時候,我們的編譯器沒有在classpath中發現需要的類名包的錯。
發現
由於第一個問題沒有真正發現根源,就解決了,所以在網上找了一下原因,也做了一下猜測————
1、由於功能jar包有重複,所以可能在建立http連接的時候創建用的是一個jar包的類方法,釋放的時候可能用的是另外一個jar包的方法,由於沒有釋放乾淨(版本問題),所以就出錯了。
2、可能由於併發的請求有點多造成引用或者調用jar包的問題。
3、可能和jvm對於jar包的加載機制和類的加載機制有關,加載了新的jar包,而調用jar包的方式都是適用於舊版的。
看了看jvm的類加載機制,感覺受益匪淺,雖然沒有瞭解到想要解決的問題。