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

您的位置:首頁技術文章
文章詳情頁

如何用Java編寫一段代碼引發內存泄露

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

文本來自StackOverflow問答網站的一個熱門討論:如何用Java編寫一段會發生內存泄露的代碼。

Q:剛才我參加了面試,面試官問我如何寫出會發生內存泄露的Java代碼。這個問題我一點思路都沒有,好囧。

A1:通過以下步驟可以很容易產生內存泄露(程序代碼不能訪問到某些對象,但是它們仍然保存在內存中):

應用程序創建一個長時間運行的線程(或者使用線程池,會更快地發生內存泄露)。線程通過某個類加載器(可以自定義)加載一個類。該類分配了大塊內存(比如new byte[1000000]),在某個靜態變量存儲一個強引用,然后在ThreadLocal中存儲它自身的引用。分配額外的內存new byte[1000000]是可選的(類實例泄露已經足夠了),但是這樣會使內存泄露更快。線程清理自定義的類或者加載該類的類加載器。重復以上步驟。

由于沒有了對類和類加載器的引用,ThreadLocal中的存儲就不能被訪問到。ThreadLocal持有該對象的引用,它也就持有了這個類及其類加載器的引用,類加載器持有它所加載的類的所有引用,這樣GC無法回收ThreadLocal中存儲的內存。在很多JVM的實現中Java類和類加載器直接分配到permgen區域不執行GC,這樣導致了更嚴重的內存泄露。

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

A2:

靜態變量引用對象

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

調用長字符串的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();

未關閉已打開流(文件,網絡等)

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

未關閉連接

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

JVM的GC不可達區域

比如通過native方法分配的內存。

web應用在application范圍的對象,應用未重啟或者沒有顯式移除

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

web應用在session范圍的對象,未失效或者沒有顯式移除

session.setAttribute("SOME_MAP", map);

不正確或者不合適的JVM選項

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

A3:如果HashSet未正確實現(或者未實現)hashCode()或者equals(),會導致集合中持續增加“副本”。如果集合不能地忽略掉它應該忽略的元素,它的大小就只能持續增長,而且不能刪除這些元素。

如果你想要生成錯誤的鍵值對,可以像下面這樣做:

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:除了被遺忘的監聽器,靜態引用,hashmap中key錯誤/被修改或者線程阻塞不能結束生命周期等典型內存泄露場景,下面介紹一些不太明顯的Java發生內存泄露的情況,主要是線程相關的。

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

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

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本一区二区中文字幕| аⅴ资源天堂资源库在线| 首页国产欧美日韩丝袜| 日韩中文字幕亚洲一区二区va在线| 首页国产欧美久久| 欧美亚洲二区| 91精品韩国| 久久亚洲精品中文字幕| 久久天堂影院| 亚洲综合电影| 日韩国产网站| 亚洲激情偷拍| 亚洲一区日韩在线| 日韩视频不卡| 久久亚洲欧美| 日韩在线电影| 日韩高清不卡一区二区| 91p九色成人| 国产亚洲欧美日韩在线观看一区二区| 日本成人精品| 国产伦乱精品| 久久精品国产亚洲一区二区三区| 一区在线免费观看| 亚洲九九精品| 精品国产一区二区三区噜噜噜| 99久久99视频只有精品| 免费观看在线综合| 老司机免费视频一区二区| 久久久一本精品| 亚洲精品护士| 日韩欧美字幕| 日本麻豆一区二区三区视频| 亚洲三级欧美| 亚洲v天堂v手机在线| 国产欧美一区二区三区精品酒店 | 久久高清免费| 日本视频在线一区| 狠狠躁少妇一区二区三区| 亚洲激情国产| 精品午夜久久| 热久久免费视频| 超级白嫩亚洲国产第一| 伊人久久亚洲美女图片| 国产乱码精品一区二区三区亚洲人| 蜜桃视频在线网站| 国产精选在线| 亚洲成人不卡| 日本vs亚洲vs韩国一区三区二区| 精品视频国产| 91精品二区| 欧美日本不卡高清| 亚洲爱爱视频| 婷婷久久免费视频| 国产66精品| 免费观看在线综合| 精品一区二区男人吃奶 | 色欧美自拍视频| 国产二区精品| 国产精品夜夜夜| 欧美日韩国产高清电影| 黄色网一区二区| 欧美日韩日本国产亚洲在线| 国产麻豆精品| 日韩在线黄色| 狠狠久久婷婷| 日韩欧美看国产| 国产精品白浆| 亚洲精品在线二区| japanese国产精品| 日韩精品专区| 日本精品一区二区三区在线观看视频| 久久精品主播| 中文字幕在线视频网站| 国产精品色在线网站| 中文一区一区三区免费在线观| 人人精品亚洲| 精品三级av在线导航| 88久久精品| 亚洲欧洲av| 久久国产福利| 亚洲精品国产嫩草在线观看| 另类小说一区二区三区| 日韩高清一区| 日韩一区精品| 亚洲欧美一级| 蜜桃久久av| 精品视频91| 蜜臀av一区二区在线免费观看| 日韩国产欧美| 久久一区欧美| 欧美影院精品| 蜜桃视频第一区免费观看| 日本精品不卡| 卡一卡二国产精品| 日韩av一区二区在线影视| 91成人精品视频| 日韩高清成人| 狠狠久久伊人| 国产精品丝袜在线播放| 亚洲免费专区| 久久久人人人| а√天堂中文在线资源8| 国产欧美91| 中文字幕成人| 亚洲视频二区| 免费观看在线综合色| 在线国产日韩| 日韩手机在线| 欧美日韩18| 国产精品久久乐| 国产精品v一区二区三区| 国产丝袜一区| 国产精品乱战久久久| 免费在线亚洲| 国产一区二区三区国产精品| 国产日韩欧美| 国产精品视频一区视频二区| 美腿丝袜在线亚洲一区| 国产一区二区三区网| 国产精品久久久久久久免费观看 | 中文字幕日韩亚洲| 深夜福利一区| 国产精品一区二区美女视频免费看| 清纯唯美亚洲综合一区| 国产精品毛片久久久| 精品国产a一区二区三区v免费| 日本成人中文字幕| 九九久久国产| 欧美激情91| 黄色精品视频| 国产一区丝袜| 久久久久久网| 男女男精品网站| 亚洲一区日韩| 亚洲伊人精品酒店| 综合激情一区| 日韩国产一区二| 欧美精品中文| 国产欧美久久一区二区三区| 亚洲伊人精品酒店| 日韩区一区二| 欧美欧美黄在线二区| 国产伦精品一区二区三区视频| 欧美激情视频一区二区三区免费| 久久三级中文| 婷婷激情一区| 黄色亚洲免费| 亚洲理论在线| 国产探花一区二区| 国产一区二区三区黄网站| 天堂中文av在线资源库| 日韩av首页| 日韩一级精品| 日韩欧美中文字幕在线视频| 婷婷综合成人| 免费观看亚洲天堂| 日本久久成人网| 亚洲精品伦理| 精品午夜视频| 午夜久久99| 久久精品99久久无色码中文字幕| 好吊一区二区三区| 久久精品资源| 蜜臀va亚洲va欧美va天堂| 日韩大片在线| 日韩激情一二三区| 免费观看久久av| 国产精品资源| 欧美日韩国产高清电影| 亚洲精品三级| 香蕉成人av| 欧美日本久久| 免费观看久久av| 国产精品2023| 蜜臀av亚洲一区中文字幕| 日韩亚洲精品在线观看| 国产不卡精品在线| 亚洲国产不卡| 国产日产精品_国产精品毛片 | 亚洲乱码视频| 粉嫩av一区二区三区四区五区 | 日本在线精品| 综合激情视频| 日本久久精品| 亚洲一区欧美激情| 乱一区二区av| 亚洲一区导航| а√天堂8资源中文在线| 久色成人在线| 久久国产人妖系列| 丝袜美腿一区| 日韩福利视频一区| 日韩中文在线电影| 日韩高清电影免费| 久久九九精品| 欧美日一区二区在线观看| 免费精品国产的网站免费观看| 国产精品www.| 日韩精品久久久久久久电影99爱| 久久免费黄色|