ReferenceTable overflow (max=512)

問題來源:
寫了一個較爲複雜的Native so庫,裏面使用了鏈表,從鏈表中取出數據,裝載到Java LinkedList中。
當測試數據較小的時候還沒有問題,當測試數據達到一定規模的時候就出現了ReferenceTable overflow (max=512)錯誤。
 
解決問題:
1.我們通過閱讀JNI的文檔,對於FindClass 返回的一定需要調用DeleteLocalRef,還有jbyteArray 類型的變量需要DeleteLocalRef。
在我的代碼中,這些都已經進行了處理,那麼還有那些是Local Ref?
 
NewString/ NewStringUTF/NewObject/ GetObjectField生成的是不是?
 
通過測試發現,這些都是,Local Ref。
 
2.雖然把上面發現的都修改了,但還是出現ReferenceTable overflow (max=512)錯誤,通過代碼閱讀發現。有一處代碼是這樣寫的。
 
SetObjectField(dwi, jfID, env->NewStringUTF(szDateTime))
問題就在env->NewStringUTF(szDateTime)地方,因爲這種寫法也是看Sun JNI的文檔這樣寫的,因其在鏈表的循環中,在沒有退出函數前,JNI的NewStringUTF產生的LocelRef不停的產生,從而導致ReferenceTable overflow (max=512)。
 
總結:
1.FindClass /NewString/ NewStringUTF/NewObject/ GetObjectField等產生的都是LocalRef,LocalRef有三種方式被VM 的GC清理。
2.不要學Sun JNI文檔中類似下面的寫法SetObjectField(dwi, jfID, env->NewStringUTF(szDateTime))。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章