我在程序上運行了一個堆轉儲。當我在內存分析工具中打開它時,發現org.logicalcobwebs.proxool.ProxyStatement
的java.lang.ref.Finalizer
佔用大量內存。這是爲什麼?是內存泄漏?爲什麼java.lang.ref.Finalizer吃了這麼多內存
回答
一些類實現Object.finalize()
方法。重寫此方法的對象需要由後臺線程調用終結器調用,並且在這種情況發生之前無法清理它們。如果這些任務很短,而且不會丟棄其中的許多,那麼這一切都會很好。但是,如果要創建大量這些對象和/或它們的終結器需要很長時間,則需要完成對象的隊列。這個隊列有可能用完所有的內存。
的解決方案是
- 如果你可以(如果你正在寫的類的對象)不使用的finalize()d對象
- 使敲定很短的(如果你要使用它)
- 不要每次都放棄這樣的對象(嘗試重新使用它們)
的最後一個選項可能是最適合你,你正在使用現有的庫。
選項#4 - 避免使用(over-)使用終結器的庫。 –
選項#1的變體;) –
也許問題是Finalizer線程的原因。 一個類重寫finalize methond,導致Finalizer線程死鎖 – fuyou001
從我能做出來的事情來看,Proxool是一個JDBC連接的連接池。這表明問題在於你的應用程序正在濫用連接池。而不是在語句對象上調用close
,您的代碼可能會丟棄它們和/或它們的父連接。 Proxool依靠終結器來關閉底層驅動程序實現的對象......但是這需要那些Finalizer實例。這也可能意味着,您正在導致連接更頻繁地打開/關閉(實際)數據庫連接,這會影響性能。
因此,我建議您檢查泄漏的ResultSet,Statement和/或Connection對象的代碼,並確保您在finally
塊中關閉它們。
看着內存轉儲,我期望你關心的是898,527,228字節在哪裏。絕大多數由終止器對象保留,其ID爲2aab07855e38
。如果你仍然有轉儲文件,看看Finalizer
指的是什麼。它看起來比Proxool對象更有問題。
謝謝,但我不能找到JDBC連接輪詢memoy泄漏的原因 – fuyou001
嗯,我不能,除非我看到你的源代碼。 (而且我不準備花時間拖網通過它......) –
- 1. 爲什麼這是內存泄漏
- 2. DOM:爲什麼這是內存泄漏?
- 3. xCode - 爲什麼這個內存泄漏?
- 4. 什麼是造成內存泄漏?
- 5. 爲什麼會有內存泄漏? (C)
- 6. c-extension Python內存泄漏,爲什麼?
- 7. 爲什麼GameCenterManager.m中有內存泄漏?
- 8. 爲什麼glColor3f導致內存泄漏
- 9. 爲什麼MoonSharp DoString泄漏內存?
- 10. 爲什麼我有內存泄漏?
- 11. 爲什麼我收到內存泄漏
- 12. 爲什麼ActionController :: Metal會泄漏內存?
- 13. 爲什麼內存泄漏在Xcode
- 14. 爲什麼使用getImageData泄漏內存
- 15. 爲什麼我的CCParticleExplosion泄漏內存?
- 16. 爲什麼我的shared_ptr泄漏內存?
- 17. 爲什麼QApplication會泄漏內存?
- 18. c pthreads + valgrind =內存泄漏:爲什麼?
- 19. 爲什麼不給內存泄漏?
- 20. 這個erlang代碼爲什麼會吃這麼多的內存?
- 21. 不知道爲什麼這是內存泄漏,請指教!
- 22. 這是爲什麼導致內存泄漏?
- 23. 爲什麼不是這個NSMutableSet泄漏內存
- 24. 爲什麼這是一個內存泄漏?
- 25. 這是內存泄漏嗎?
- 26. 這是內存泄漏嗎?
- 27. 這是內存泄漏嗎?
- 28. 這是內存泄漏嗎?
- 29. 這是內存泄漏嗎?
- 30. 爲什麼UIWebView吃這麼多的內存?
「圖片」鏈接轉到看起來是你的twitter個人資料。 –
@ R.MartinhoFernandes我認爲它可以看到他用Twitter發佈的圖片。 – Oliver