OutOfMemoryError:解决方案反模式
這些年來(lái),我們一直密切關(guān)注以O(shè)utOfMemoryError消息的不同形式打包的問(wèn)題。 通過(guò)專(zhuān)門(mén)的服務(wù)(例如Google警報(bào)),每天就特定關(guān)鍵字的新問(wèn)題進(jìn)行摘要,使我們對(duì)應(yīng)用程序因日志中的java.lang.OutOfMemoryError失敗而出現(xiàn)的情況有了一個(gè)很好的了解。
面臨問(wèn)題的人們往往會(huì)陷入細(xì)分市場(chǎng),因此我決定對(duì)一些更有趣的角色進(jìn)行一些描述。
自學(xué)成才的外科醫(yī)生 。 這些家伙現(xiàn)在真正具有創(chuàng)造力,我絕對(duì)必須為此贊揚(yáng)他們。 當(dāng)遇到意外的錯(cuò)誤消息時(shí),他們提出了很多解釋為什么可能發(fā)生此特定錯(cuò)誤。 并立即解決該問(wèn)題。
我已經(jīng)多次看到以下所有內(nèi)容,以至于我什至失去了計(jì)數(shù)。 我只能保證這些例子既真實(shí)又可怕:
- “即使我購(gòu)買(mǎi)了16G的額外RAM,我仍然收到OutOfMemoryError錯(cuò)誤”。 好吧,與其增加-Xmx,對(duì)于許多人來(lái)說(shuō),最明顯的解決方案似乎是轉(zhuǎn)向瘋狂購(gòu)物。
- “我的日志中遇到一個(gè)OutOfMemoryError,我發(fā)現(xiàn)一個(gè).class文件的長(zhǎng)度超過(guò)1500行。 擺脫掉消息,我的類(lèi)文件必須有多小”。 如何獲得類(lèi)文件中的行數(shù)與堆空間用盡之間的相關(guān)性,這超出了我的范圍,但是我想這種瘋狂的做法是可行的。
- “我從使用java.util.Vectors切換到j(luò)ava.util.ArrayList,花了一個(gè)月的時(shí)間來(lái)重構(gòu)我的應(yīng)用程序,但仍然出現(xiàn)OutOfMemoryError”。 好吧,對(duì)您有好處,Vectors如此1999年。但同樣,如果您不知道是什么導(dǎo)致疾病的原因,為什么要治愈患者?
這個(gè)名單可能永遠(yuǎn)持續(xù)下去。 令我感到好奇的是-當(dāng)軟件開(kāi)發(fā)人員的行為舉止如此時(shí)-我下次還要去看醫(yī)生時(shí)是否還應(yīng)該格外小心?
配置H2x0rz 。 如果JVM配置中有一個(gè)參數(shù),則必須對(duì)其進(jìn)行調(diào)整。 這似乎是該特定人群的唯一真理。 確實(shí),Oracle JVM工程師推薦的默認(rèn)值有任何意義的機(jī)會(huì)是什么。 結(jié)果? 應(yīng)用程序啟動(dòng)時(shí)的最小堆太大,線程優(yōu)先級(jí)混亂,使用期限極低的使用區(qū)域或不合適的和/或?qū)嶒?yàn)性的GC算法。
不要誤會(huì)我的意思,如果您知道自己在做什么,并且正在根據(jù)實(shí)際測(cè)量結(jié)果進(jìn)行微調(diào),那就繼續(xù)吧。 通常,這些類(lèi)型的用戶(hù)從某個(gè)地方繼承了“正確的配置選項(xiàng)集”,并且現(xiàn)在將相同的-XX參數(shù)集應(yīng)用于那里看到的每個(gè)JVM。 求你了 您上次面對(duì)的具有高度事務(wù)性的Web應(yīng)用程序與您現(xiàn)在唾手可得的數(shù)據(jù)繁忙的批處理作業(yè)完全不同。
數(shù)據(jù)激增的受害者 。 這些家伙多年來(lái)一直在構(gòu)建和運(yùn)行業(yè)務(wù)應(yīng)用程序而沒(méi)有重大性能問(wèn)題。 然后,雷電擊中該應(yīng)用程序在日志文件中出現(xiàn)OutOfMemoryErrors的情況下死在地面上。 通過(guò)執(zhí)行一次將太多數(shù)據(jù)一次加載到內(nèi)存中的操作,某些用戶(hù)突然能夠?qū)⒄麄€(gè)應(yīng)用程序運(yùn)行到地面。
無(wú)論是由于業(yè)務(wù)良好而引起的,還是客戶(hù)數(shù)量剛剛增長(zhǎng)超過(guò)一定的魔點(diǎn),還是公司收購(gòu)并合并了一個(gè)使數(shù)據(jù)量增加一倍的競(jìng)爭(zhēng)對(duì)手,效果都是一樣的。
可以通過(guò)應(yīng)用許多眾所周知的工具和技術(shù)來(lái)解決這樣的情況,當(dāng)它們被識(shí)別時(shí)。 您可以推遲數(shù)據(jù)加載,小批量處理操作或更改負(fù)責(zé)存儲(chǔ)此數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)-由您決定。 這些解決方案中的許多解決方案都非常合適。
但是,在這種情況下,我們看到的是將問(wèn)題隱藏在增大的堆大小下。 通過(guò)增加配置中的-Xmx確實(shí)可以逃脫OutOfMemoryError,但是您仍然經(jīng)常對(duì)用戶(hù)造成傷害。 大型操作仍需要很長(zhǎng)時(shí)間才能完成,因此,由于增加的延遲而使用戶(hù)煩惱。 更糟糕的是,增加堆時(shí),通常會(huì)導(dǎo)致GC暫停跨越到無(wú)法忍受的長(zhǎng)度。
我的世界 如果我必須選擇一個(gè)負(fù)責(zé)內(nèi)存泄漏的應(yīng)用程序,那就是Minecraft。 多年來(lái),我很可能看到成千上萬(wàn)沮喪的9歲兒童被迫處理堆配置。
快速搜索可以發(fā)現(xiàn)問(wèn)題的嚴(yán)重性,對(duì)于那些考慮發(fā)布基于Java的桌面軟件的人來(lái)說(shuō),我想這是一個(gè)很好的案例研究。
如果您不覺(jué)得自己屬于所列的任何組,那就好。 您是務(wù)實(shí)的工程師之一,他們?cè)谕ㄟ^(guò)總結(jié)得出結(jié)論之前,通過(guò)仔細(xì)研究因果關(guān)系來(lái)為自己的Craft.io感到自豪。
翻譯自: https://www.javacodegeeks.com/2014/02/outofmemoryerror-solution-antipatterns.html
總結(jié)
以上是生活随笔為你收集整理的OutOfMemoryError:解决方案反模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 红米root权限在哪设置(红米手机如何设
- 下一篇: 教程:编写自己的CDI扩展