string.intern_使用String.intern()减少内存使用
string.intern
時不時地會有一個垂死的生產應用程序。 而且您知道您需要盡快對其進行修補。 我們也是如此,并認為分享最近的一個戰爭故事會很有趣。 在這種情況下,我們就有機會使用String.intern()之類的簡單補丁來修補應用程序。 但是,讓我從頭開始。
當前的應用程序正遭受內存不足的困擾,甚至在最近的更改后也無法啟動。 癥狀包括JVM重新啟動后CPU使用率過高,然后幾分鐘后出現致命的OutOfMemoryError:日志中的堆空間 。 快速查看堆內容使我們產生了疑問-應用程序正在將數百萬個對象加載到某個內部數據結構中。
與開發團隊進行的背景調查顯示,加載的對象數量最近乘以兩倍-而不是大約500萬個對象,應用程序現在必須處理大約一千萬個內存實例。 實際上,這可能會占用一些堆空間。 但是,知道可能的原因并不會給我們帶來太大幫助-企業主絕不愿意放棄他們剛剛獲取的寶貴數據。
深入研究手頭的數據結構,我們發現其在下面過度使用了字符串。 對于我們的任何讀者來說,這都不奇怪。 但是其中一些字符串包含重復的表示內容。 您可以將地址元素(例如街道名稱和/或國家/地區)視為等效的情況。
快速解決方案開始在我們的腦海中醞釀。 如果我們內部化那些重復的字符串怎么辦? 與應用程序的開發人員Swift核實之后,我們獲得了綠燈。 開發人員保證,將包含實習的副作用,例如記住String.intern()與我們內部化的Strings進行比較的所有字符串。 感謝上帝的封裝。
現在我們只需要了解內部化要引入多少CPU開銷。 令我們驚訝的是,實習到大約1000萬個琴弦只花了不到四分鐘的時間。 并為我們節省了大約不足的500MB內存。 因此,節省了時間。
現在,在您跳至應用程序并開始內部化將要找到的所有Strings之前,我必須事先警告您。 有很多可能出錯的地方:
- 您內部化的字符串將從堆中消失,并移至永久代。 因此,請確保您在permgen空間中有足夠的空間。
- 確保將要與內部化的字符串進行比較的所有字符串內部化。 否則,您將在應用程序中創建最討厭的錯誤類型。
- 確保可以忍受內部化時的CPU開銷。 這是一個本機方法調用,因此它將完全取決于您的特定平臺,因此請確保在進行生產更改之前嘗試一下
我們承認這種情況很少見–數據結構包含許多重復的String對象,并與應用程序集成在一起,從而使我們能夠隔離快速修復。 甚至在我們的情況下,該修復程序很快也被開發人員刪除,他們將數據結構重新設計為更合理的圖形表示形式。
但是除了警告-Java虛擬機中內置了有趣且有用的工具。 知道如何使用它們,并提防它們的副作用,它們將成為您的朋友。 謹慎使用它們,您可以輕松終止應用程序。 您最好的朋友將永遠是在您自己的應用程序之上構建的實際測試用例。
翻譯自: https://www.javacodegeeks.com/2013/06/reducing-memory-usage-with-string-intern.html
string.intern
總結
以上是生活随笔為你收集整理的string.intern_使用String.intern()减少内存使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑自我修复命令(电脑自我修复命令怎么用
- 下一篇: 利用2台路由器进行联网如何2条网线共用一