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