日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

如何用Java編寫(xiě)一段代碼引發(fā)內(nèi)存泄露

瀏覽:28日期:2022-09-06 14:13:27

文本來(lái)自StackOverflow問(wèn)答網(wǎng)站的一個(gè)熱門(mén)討論:如何用Java編寫(xiě)一段會(huì)發(fā)生內(nèi)存泄露的代碼。

Q:剛才我參加了面試,面試官問(wèn)我如何寫(xiě)出會(huì)發(fā)生內(nèi)存泄露的Java代碼。這個(gè)問(wèn)題我一點(diǎn)思路都沒(méi)有,好囧。

A1:通過(guò)以下步驟可以很容易產(chǎn)生內(nèi)存泄露(程序代碼不能訪問(wèn)到某些對(duì)象,但是它們?nèi)匀槐4嬖趦?nèi)存中):

應(yīng)用程序創(chuàng)建一個(gè)長(zhǎng)時(shí)間運(yùn)行的線程(或者使用線程池,會(huì)更快地發(fā)生內(nèi)存泄露)。線程通過(guò)某個(gè)類加載器(可以自定義)加載一個(gè)類。該類分配了大塊內(nèi)存(比如new byte[1000000]),在某個(gè)靜態(tài)變量存儲(chǔ)一個(gè)強(qiáng)引用,然后在ThreadLocal中存儲(chǔ)它自身的引用。分配額外的內(nèi)存new byte[1000000]是可選的(類實(shí)例泄露已經(jīng)足夠了),但是這樣會(huì)使內(nèi)存泄露更快。線程清理自定義的類或者加載該類的類加載器。重復(fù)以上步驟。

由于沒(méi)有了對(duì)類和類加載器的引用,ThreadLocal中的存儲(chǔ)就不能被訪問(wèn)到。ThreadLocal持有該對(duì)象的引用,它也就持有了這個(gè)類及其類加載器的引用,類加載器持有它所加載的類的所有引用,這樣GC無(wú)法回收ThreadLocal中存儲(chǔ)的內(nèi)存。在很多JVM的實(shí)現(xiàn)中Java類和類加載器直接分配到permgen區(qū)域不執(zhí)行GC,這樣導(dǎo)致了更嚴(yán)重的內(nèi)存泄露。

這種泄露模式的變種之一就是如果你經(jīng)常重新部署以任何形式使用了ThreadLocal的應(yīng)用程序、應(yīng)用容器(比如Tomcat)會(huì)很容易發(fā)生內(nèi)存泄露(由于應(yīng)用容器使用了如前所述的線程,每次重新部署應(yīng)用時(shí)將使用新的類加載器)。

A2:

靜態(tài)變量引用對(duì)象

class MemorableClass { static final ArrayList list = new ArrayList(100);}

調(diào)用長(zhǎng)字符串的String.intern()

String str=readString(); // read lengthy string any source db,textbox/jsp etc..// This will place the string in memory pool from which you cant removestr.intern();

未關(guān)閉已打開(kāi)流(文件,網(wǎng)絡(luò)等)

try { BufferedReader br = new BufferedReader(new FileReader(inputFile)); ... ...} catch (Exception e) { e.printStacktrace();}

未關(guān)閉連接

try { Connection conn = ConnectionFactory.getConnection(); ... ...} catch (Exception e) { e.printStacktrace();}

JVM的GC不可達(dá)區(qū)域

比如通過(guò)native方法分配的內(nèi)存。

web應(yīng)用在application范圍的對(duì)象,應(yīng)用未重啟或者沒(méi)有顯式移除

getServletContext().setAttribute("SOME_MAP", map);

web應(yīng)用在session范圍的對(duì)象,未失效或者沒(méi)有顯式移除

session.setAttribute("SOME_MAP", map);

不正確或者不合適的JVM選項(xiàng)

比如IBM JDK的noclassgc阻止了無(wú)用類的垃圾回收

A3:如果HashSet未正確實(shí)現(xiàn)(或者未實(shí)現(xiàn))hashCode()或者equals(),會(huì)導(dǎo)致集合中持續(xù)增加“副本”。如果集合不能地忽略掉它應(yīng)該忽略的元素,它的大小就只能持續(xù)增長(zhǎng),而且不能刪除這些元素。

如果你想要生成錯(cuò)誤的鍵值對(duì),可以像下面這樣做:

class BadKey { // no hashCode or equals(); public final String key; public BadKey(String key) { this.key = key; }} Map map = System.getProperties();map.put(new BadKey("key"), "value"); // Memory leak even if your threads die.

A4:除了被遺忘的監(jiān)聽(tīng)器,靜態(tài)引用,hashmap中key錯(cuò)誤/被修改或者線程阻塞不能結(jié)束生命周期等典型內(nèi)存泄露場(chǎng)景,下面介紹一些不太明顯的Java發(fā)生內(nèi)存泄露的情況,主要是線程相關(guān)的。

Runtime.addShutdownHook后沒(méi)有移除,即使使用了removeShutdownHook,由于ThreadGroup類對(duì)于未啟動(dòng)線程的bug,它可能不被回收,導(dǎo)致ThreadGroup發(fā)生內(nèi)存泄露。創(chuàng)建但未啟動(dòng)線程,與上面的情形相同創(chuàng)建繼承了ContextClassLoader和AccessControlContext的線程,ThreadGroup和InheritedThreadLocal的使用,所有這些引用都是潛在的泄露,以及所有被類加載器加載的類和所有靜態(tài)引用等等。這對(duì)ThreadFactory接口作為重要組成元素整個(gè)j.u.c.Executor框架(java.util.concurrent)的影響非常明顯,很多開(kāi)發(fā)人員沒(méi)有注意到它潛在的危險(xiǎn)。而且很多庫(kù)都會(huì)按照請(qǐng)求啟動(dòng)線程。ThreadLocal緩存,很多情況下不是好的做法。有很多基于ThreadLocal的簡(jiǎn)單緩存的實(shí)現(xiàn),但是如果線程在它的期望生命周期外繼續(xù)運(yùn)行ContextClassLoader將發(fā)生泄露。除非真正必要不要使用ThreadLocal緩存。當(dāng)ThreadGroup自身沒(méi)有線程但是仍然有子線程組時(shí)調(diào)用ThreadGroup.destroy()。發(fā)生內(nèi)存泄露將導(dǎo)致該線程組不能從它的父線程組移除,不能枚舉子線程組。使用WeakHashMap,value直接(間接)引用key,這是個(gè)很難發(fā)現(xiàn)的情形。這也適用于繼承Weak/SoftReference的類可能持有對(duì)被保護(hù)對(duì)象的強(qiáng)引用。使用http(s)協(xié)議的java.net.URL下載資源。KeepAliveCache在系統(tǒng)ThreadGroup創(chuàng)建新線程,導(dǎo)致當(dāng)前線程的上下文類加載器內(nèi)存泄露。沒(méi)有存活線程時(shí)線程在第一次請(qǐng)求時(shí)創(chuàng)建,所以很有可能發(fā)生泄露。(在Java7中已經(jīng)修正了,創(chuàng)建線程的代碼合理地移除了上下文類加載器。)使用InflaterInputStream在構(gòu)造函數(shù)(比如PNGImageDecoder)中傳遞new java.util.zip.Inflater(),不調(diào)用inflater的end()。僅僅是new的話非常安全,但如果自己創(chuàng)建該類作為構(gòu)造函數(shù)參數(shù)時(shí)調(diào)用流的close()不能關(guān)閉inflater,可能發(fā)生內(nèi)存泄露。這并不是真正的內(nèi)存泄露因?yàn)樗鼤?huì)被finalizer釋放。但這消耗了很多native內(nèi)存,導(dǎo)致linux的oom_killer殺掉進(jìn)程。所以這給我們的教訓(xùn)是:盡可能早地釋放native資源。java.util.zip.Deflater也一樣,它的情況更加嚴(yán)重。好的地方可能是很少用到Deflater。如果自己創(chuàng)建了Deflater或者Inflater記住必須調(diào)用end()。

原文鏈接: stackoverflow 翻譯: ImportNew.com - hejiani

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产一区二区三区视频在线| 日韩av午夜在线观看| 精品国产a一区二区三区v免费| 欧美中文一区| 国产欧美日韩精品高清二区综合区 | 99国产精品久久久久久久成人热| 国产成人精品一区二区三区视频| 福利一区二区三区视频在线观看| 国产一区二区精品久| 91欧美在线| 欧美日韩精品在线一区| 欧美色图一区| 男女性色大片免费观看一区二区| 蜜桃久久久久久| 国产调教精品| 欧美国产免费| 国产精品yjizz视频网| 久久精品免费一区二区三区| 好看不卡的中文字幕| 三级在线观看一区二区| 亚洲人www| 欧美一级二级视频| 久久精品国产网站| 久久国产免费| 一区二区三区国产在线| 国产精品久久久久久模特| 成人在线超碰| 婷婷色综合网| 亚洲精品在线a| 国产精品久久久免费| 中文在线资源| 9色国产精品| 日韩av午夜在线观看| 高清日韩欧美| 国产午夜精品一区二区三区欧美| 日韩有吗在线观看| 国产精品草草| 91精品一区国产高清在线gif| 国产亚洲毛片| 国产精品综合| 久久久久国产| 婷婷成人av| 激情黄产视频在线免费观看| 亚洲男女av一区二区| 日韩精品亚洲专区在线观看| 国精品产品一区| 日韩视频精品在线观看| 日本欧美大码aⅴ在线播放| 国产一区二区三区国产精品| 女人天堂亚洲aⅴ在线观看| 久久精品超碰| 久久精品主播| 91国内精品| 欧美不卡高清一区二区三区| 日韩精品中文字幕吗一区二区| 亚洲国产福利| 中文字幕免费一区二区| 久久精品国产亚洲一区二区三区| 亚洲激情欧美| 精品国产乱码久久久| 老鸭窝毛片一区二区三区| 久久69成人| 中文字幕日韩亚洲| av在线资源| 日韩高清在线不卡| 99久久亚洲精品蜜臀| 日本成人在线不卡视频| 成人日韩精品| 欧美精品国产一区| 免费国产自久久久久三四区久久| 国产欧美二区| 久久av在线| 日本韩国欧美超级黄在线观看| 国产视频一区二区在线播放| 中文国产一区| 色在线中文字幕| 国产剧情在线观看一区| 久久国产高清| 伊人久久大香线蕉av不卡| 久久福利在线| 日韩精选在线| 亚洲国产成人精品女人| 国产精品久久观看| 久久激情av| 亚洲人妖在线| 亚洲欧美日韩专区| 久久人人99| 亚洲女同av| 欧美激情网址| 欧美一区影院| 亚洲精品乱码久久久久久蜜桃麻豆 | 日韩欧美一区二区三区在线观看 | 欧美日韩精品一区二区三区视频 | 日韩理论片av| 欧美激情日韩| 欧美中文高清| 亚洲专区视频| 亚洲综合三区| 韩日一区二区三区| 久久久久久免费视频| 国产伦久视频在线观看| 欧美激情三区| 欧美精品97| 国产精品一区二区三区av麻| 日韩高清成人在线| 亚洲综合中文| 视频一区视频二区中文| 99在线精品免费视频九九视| 在线日韩欧美| 国产一区二区三区自拍| 少妇精品导航| 午夜精品久久久久久久久久蜜桃| аⅴ资源天堂资源库在线| 国产一区不卡| 日韩av有码| 色一区二区三区| 日本一区二区免费高清| 日韩成人精品一区| 日韩成人精品一区| 在线中文字幕播放| xxxxx性欧美特大| 老牛影视精品| 亚洲伦乱视频| 欧美日韩水蜜桃| 激情91久久| 蜜臀久久99精品久久久画质超高清| 99xxxx成人网| 久久aⅴ国产紧身牛仔裤| 亚洲欧美日韩国产| 亚洲精品美女91| 视频一区日韩| 欧美日本一区| 麻豆精品久久| 日韩精品诱惑一区?区三区| 久久精品二区三区| 国产亚洲精品久久久久婷婷瑜伽| 亚洲一区观看| 婷婷久久免费视频| 国产经典一区| 日韩精品诱惑一区?区三区| 亚洲韩日在线| 麻豆9191精品国产| 日韩高清不卡在线| 久久影视三级福利片| 欧美日韩精品免费观看视完整| 亚洲二区视频| 亚洲精品乱码久久久久久蜜桃麻豆| 日本va欧美va欧美va精品| 精品五月天堂| 久久久夜精品| 亚洲资源网站| 久久99久久久精品欧美| 日韩久久电影| 日av在线不卡| 国产精品国码视频| 福利一区在线| 亚洲欧美日韩国产一区二区| 丝袜国产日韩另类美女| 欧美日韩xxxx| 国产在线观看www| 一区二区自拍| 国产图片一区| 久久精品国产99久久| 免费久久99精品国产| 免费一级欧美在线观看视频| 欧洲av一区二区| 亚洲深深色噜噜狠狠爱网站| 国产精品资源| 久久久天天操| 91成人精品观看| 日韩在线短视频| 亚洲精品欧美| 久久只有精品| 午夜欧美精品| 国产精品一区二区三区www| 久久精品亚洲人成影院 | 日本午夜精品一区二区三区电影| 精品一区二区三区中文字幕 | 狠狠久久伊人中文字幕| 国产精品88久久久久久| 亚洲精品看片| 日韩精品2区| 日韩二区在线观看| 999国产精品视频| 欧美日韩亚洲一区| 亚洲午夜黄色| 国产精品v亚洲精品v日韩精品| 国产伊人精品| 国产精品日本一区二区不卡视频 | 日韩精品一区二区三区中文 | 久久av电影| 亚洲欧美日本国产专区一区| 精品亚洲成人| 亚洲精品欧美| 亚洲午夜电影| 久久精品国产网站| 中文字幕一区二区精品区| 日韩中文影院| 欧美国产先锋| 最近国产精品视频|