国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

納尼,Java 存在內(nèi)存泄泄泄泄泄泄漏嗎?

李世贊 / 2328人閱讀

摘要:集合中的內(nèi)存泄漏,比如等,這些對(duì)象經(jīng)常會(huì)發(fā)生內(nèi)存泄露。目前,我們通常使用一些工具來檢查程序的內(nèi)存泄漏問題。開發(fā)人員將根據(jù)這些信息判斷程序是否有內(nèi)存泄漏問題。

01. 怎么回事?

納尼,Java 不是自動(dòng)管理內(nèi)存嗎?怎么可能會(huì)出現(xiàn)內(nèi)存泄泄泄泄泄泄漏!

Java 最牛逼的一個(gè)特性就是垃圾回收機(jī)制,不用像 C++ 需要手動(dòng)管理內(nèi)存,所以作為 Java 程序員很幸福,只管 New New New 即可,反正 Java 會(huì)自動(dòng)回收過期的對(duì)象。。。

那么 Java 都自動(dòng)管理內(nèi)存了,那怎么會(huì)出現(xiàn)內(nèi)存泄漏,難道 Jvm 有 bug"); 02. 怎么判斷可以被回收

先了解一下 Jvm 是怎么判斷一個(gè)對(duì)象可以被回收。一般有兩種方式,一種是引用計(jì)數(shù)法,一種是可達(dá)性分析。

引用計(jì)數(shù)法:每個(gè)對(duì)象有一個(gè)引用計(jì)數(shù)屬性,新增一個(gè)引用時(shí)計(jì)數(shù)加1,引用釋放時(shí)計(jì)數(shù)減1,計(jì)數(shù)為0時(shí)可以回收。

這個(gè)辦法看起來挺簡單的,但是如果出現(xiàn) A 引用了 B,B 又引用了 A,這時(shí)候就算他們都不再使用了,但因?yàn)橄嗷ヒ?計(jì)算器=1 永遠(yuǎn)無法被回收。

此方法簡單,無法解決對(duì)象相互循環(huán)引用的問題。

可達(dá)性分析(Reachability Analysis):從 GC Roots 開始向下搜索,搜索所走過的路徑稱為引用鏈。當(dāng)一個(gè)對(duì)象到 GC Roots 沒有任何引用鏈相連時(shí),則證明此對(duì)象是不可用的,那么虛擬機(jī)就判斷是可回收對(duì)象。

可達(dá)性分析可以解決循環(huán)引用的問題。

那么 gc roots 對(duì)象是哪些呢

虛擬機(jī)棧中引用的對(duì)象

方法區(qū)中類靜態(tài)屬性引用的對(duì)象

方法區(qū)中常量引用的對(duì)象

本地方法棧中JNI[即一般說的Native]引用的對(duì)象

目前主流的虛擬機(jī)中大多使用可達(dá)性分析的方式來判定對(duì)象是否可被 GC 回收。

03. 什么情況下會(huì)出現(xiàn)內(nèi)存泄漏

既然可達(dá)性分析好像已經(jīng)很牛逼的樣子了,怎么可能還會(huì)出現(xiàn)內(nèi)存泄漏呢,那我們?cè)賮砜匆幌聝?nèi)存泄漏的定義。

內(nèi)存泄露就是指一個(gè)不再被程序使用的對(duì)象或變量一直被占據(jù)在內(nèi)存中。

有可能此對(duì)象已經(jīng)不使用了,但是還有其它對(duì)象保持著此對(duì)象的引用,就會(huì)導(dǎo)致 GC 不能回收此對(duì)象,這種情況下就會(huì)出現(xiàn)內(nèi)存泄漏。

寫一個(gè)程序讓出現(xiàn)內(nèi)存泄漏

①長生命周期的對(duì)象持有短生命周期對(duì)象的引用就很可能發(fā)生內(nèi)存泄露,盡管短生命周期對(duì)象已經(jīng)不再需要,但是因?yàn)殚L生命周期對(duì)象持有它的引用而導(dǎo)致不能被回收。

public class Simple {
    Object object;
    public void method1(){
        object = new Object();
        //...其他代碼
    }
}

這里的 object 實(shí)例,其實(shí)我們期望它只作用于 method1() 方法中,且其他地方不會(huì)再用到它,但是,當(dāng)method1()方法執(zhí)行完成后,object 對(duì)象所分配的內(nèi)存不會(huì)馬上被認(rèn)為是可以被釋放的對(duì)象,只有在 Simple 類創(chuàng)建的對(duì)象被釋放后才會(huì)被釋放,嚴(yán)格的說,這就是一種內(nèi)存泄露。

解決方法就是將 object 作為 method1() 方法中的局部變量。

public class Simple {
    Object object;
    public void method1(){
        object = new Object();
        //...其他代碼
        object = null;
    }
}

當(dāng)然大家有可能會(huì)想就這一個(gè)方法也不會(huì)有多大影響,但如果在某些項(xiàng)目中,一個(gè)方法在一分鐘之內(nèi)調(diào)用上萬次的時(shí)候,就會(huì)出現(xiàn)很明顯的內(nèi)存泄漏現(xiàn)象。

②集合中的內(nèi)存泄漏,比如 HashMap、ArrayList 等,這些對(duì)象經(jīng)常會(huì)發(fā)生內(nèi)存泄露。比如當(dāng)它們被聲明為靜態(tài)對(duì)象時(shí),它們的生命周期會(huì)跟應(yīng)用程序的生命周期一樣長,很容易造成內(nèi)存不足。

下面給出了一個(gè)關(guān)于集合內(nèi)存泄露的例子。

Vector v=new Vector(10);
for (int i=1;i<100; i++)
{
    Object o=new Object();
    v.add(o);
    o=null;
}
//此時(shí),所有的Object對(duì)象都沒有被釋放,因?yàn)樽兞縱引用這些對(duì)象。

在這個(gè)例子中,我們循環(huán)申請(qǐng) Object 對(duì)象,并將所申請(qǐng)的對(duì)象放入一個(gè) Vector 中,如果我們僅僅釋放引用本身,那么 Vector 仍然引用該對(duì)象,所以這個(gè)對(duì)象對(duì) GC 來說是不可回收的。

因此,如果對(duì)象加入到 Vector 后,還必須從 Vector 中刪除,最簡單的方法就是將 Vector 對(duì)象設(shè)置為 null。

以上兩種是最常見的內(nèi)存泄漏案例。當(dāng)然還有一些內(nèi)存泄漏的例子,這里就不再一一例舉了,感興趣的同學(xué)可以在網(wǎng)上找找資料。

04. 內(nèi)存泄漏和內(nèi)存溢出

很多同學(xué)總是搞不清楚,內(nèi)存泄漏和內(nèi)存溢出的區(qū)別,它倆是兩個(gè)完全不同的概念, 它們之間存在一些關(guān)聯(lián)。

內(nèi)存溢出 out of memory,是指程序在申請(qǐng)內(nèi)存時(shí),沒有足夠的內(nèi)存空間供其使用,出現(xiàn) out of memory;

內(nèi)存泄露 memory leak,是指程序在申請(qǐng)內(nèi)存后,無法釋放已申請(qǐng)的內(nèi)存空間,一次內(nèi)存泄露危害可以忽略,但內(nèi)存泄露堆積后果很嚴(yán)重,無論多少內(nèi)存,遲早會(huì)被占光。

所以內(nèi)存泄漏可能會(huì)導(dǎo)致內(nèi)存溢出,但內(nèi)存溢出并不完全都是因?yàn)閮?nèi)存泄漏,也有可能使用了太多的大對(duì)象導(dǎo)致。

05. 如何檢測內(nèi)存泄漏

最后一個(gè)重要的問題,就是如何檢測 Java 的內(nèi)存泄漏。目前,我們通常使用一些工具來檢查 Java 程序的內(nèi)存泄漏問題。

市場上已有幾種專業(yè)檢查 Java 內(nèi)存泄漏的工具,它們的基本工作原理大同小異,都是通過監(jiān)測 Java 程序運(yùn)行時(shí),所有對(duì)象的申請(qǐng)、釋放等動(dòng)作,將內(nèi)存管理的所有信息進(jìn)行統(tǒng)計(jì)、分析、可視化。開發(fā)人員將根據(jù)這些信息判斷程序是否有內(nèi)存泄漏問題。

這些工具包括 Plumbr 、Eclipse Memory Analyzer、JProbe Profiler、JVisualVM 等。

06. 最后

以上內(nèi)容其實(shí)是我曾經(jīng)經(jīng)常面試的內(nèi)容之一,通過一系列的問題考察 Java 程序員對(duì) Jvm 的理解。

比如我通常會(huì)問面試者,Java 中存在內(nèi)存泄漏嗎?大部分人都會(huì)回答存在,接著我會(huì)問如果讓你寫一個(gè)程序讓內(nèi)存泄漏,你會(huì)怎么寫?大部分程序員就回答不上來了。

如果面試者可以回答上面的問題,我會(huì)接著和面試者聊聊,內(nèi)存泄漏和內(nèi)存溢出他們之間是否存在聯(lián)系 、以及在日常工作中如何避免寫出內(nèi)存泄漏的代碼 、如果生產(chǎn)出現(xiàn) Jvm 相關(guān)問題時(shí),排查問題的思路和步驟等等。

這些問題在我的博客中都有答案,早些年寫了一系列關(guān)于 Jvm 的文章,大家如果感興趣的話接下來繼續(xù)去閱讀,www.ityouknow.com/java.html。

如果大家覺得在手機(jī)上看著更方便,可以關(guān)注:Java 極客技術(shù)公號(hào),已經(jīng)輸出了一些 JVM 文章,我博客中的 Jvm 系列文章也都會(huì)推送到這個(gè)公號(hào)中。

關(guān)注一下又不會(huì)懷孕

參考出處:

lovoedu.gitee.io/javablog/20…
www.ibm.com/developerwo…

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/7185.html

相關(guān)文章

  • php內(nèi)核閱讀(2)--淺談 gc回收機(jī)制

    摘要:垃圾回收所謂垃圾就是指通過循環(huán)引用自己引用自己,目前只在類型中有出現(xiàn)的形式而導(dǎo)致永遠(yuǎn)不為。當(dāng)出現(xiàn)垃圾之后,的引擎有對(duì)應(yīng)的垃圾回收機(jī)制。觸發(fā)這個(gè)機(jī)制的時(shí)機(jī)是每次出現(xiàn)減少時(shí)候。 自嘲)。。。。。2333,我覺得這是因?yàn)樵趐hp語言層面就幫我們解決了內(nèi)存回收的問題,但這讓我在和java大牛們吹牛逼的時(shí)候,聽到什么內(nèi)存泄露。。。。(納尼,我tmd怎么從來沒遇見過)一臉懵逼。 本人小菜,如果下面...

    wemallshop 評(píng)論0 收藏0
  • 微服務(wù)橫行的今天, 你的文檔跟上節(jié)奏了么?

    摘要:納尼隔壁少林派表示自家金剛技?jí)喝盒墼谧魑欢际?。。。納尼你覺得寫太繁瑣了你不喜歡我們還有或者等等一大堆工具呢。納尼沒有你還是覺得無法接受好吧那么筆者推薦類似這類更友好的工具你可以導(dǎo)入導(dǎo)出其他格式也可以使用其來撰寫。 說起微服務(wù), 想必現(xiàn)在的技術(shù)圈內(nèi)人士個(gè)個(gè)都能談笑風(fēng)云, 娓娓道來。的確, 技術(shù)變革日新月異, 各種工具框架雨后春筍般涌現(xiàn), 現(xiàn)在我們可以輕巧便捷地根據(jù)自己的業(yè)務(wù)需求, 構(gòu)建...

    liaoyg8023 評(píng)論0 收藏0
  • Kubernetes之路 1 - Java應(yīng)用資源限制的迷思

    摘要:本系列文章會(huì)記錄阿里云容器服務(wù)團(tuán)隊(duì)在支持客戶中的一些心得體會(huì)和最佳實(shí)踐。阿里云服務(wù)全球首批通過一致性認(rèn)證,簡化了集群生命周期管理,內(nèi)置了與阿里云產(chǎn)品集成,也將進(jìn)一步簡化的開發(fā)者體驗(yàn),幫助用戶關(guān)注云端應(yīng)用價(jià)值創(chuàng)新。 showImg(https://segmentfault.com/img/bV6FTH?w=740&h=296); 隨著容器技術(shù)的成熟,越來越多的企業(yè)客戶在企業(yè)中選擇Dock...

    andycall 評(píng)論0 收藏0
  • Kubernetes之路 1 - Java應(yīng)用資源限制的迷思

    摘要:本系列文章會(huì)記錄阿里云容器服務(wù)團(tuán)隊(duì)在支持客戶中的一些心得體會(huì)和最佳實(shí)踐。阿里云服務(wù)全球首批通過一致性認(rèn)證,簡化了集群生命周期管理,內(nèi)置了與阿里云產(chǎn)品集成,也將進(jìn)一步簡化的開發(fā)者體驗(yàn),幫助用戶關(guān)注云端應(yīng)用價(jià)值創(chuàng)新。 showImg(https://segmentfault.com/img/bV6FTH?w=740&h=296); 隨著容器技術(shù)的成熟,越來越多的企業(yè)客戶在企業(yè)中選擇Dock...

    iliyaku 評(píng)論0 收藏0
  • Java - 收藏集 - 掘金

    摘要:強(qiáng)大的表單驗(yàn)證前端掘金支持非常強(qiáng)大的內(nèi)置表單驗(yàn)證,以及。面向?qū)ο蠛兔嫦蜻^程的區(qū)別的種設(shè)計(jì)模式全解析后端掘金一設(shè)計(jì)模式的分類總體來說設(shè)計(jì)模式分為三大類創(chuàng)建型模式,共五種工廠方法模式抽象工廠模式單例模式建造者模式原型模式。 強(qiáng)大的 Angular 表單驗(yàn)證 - 前端 - 掘金Angular 支持非常強(qiáng)大的內(nèi)置表單驗(yàn)證,maxlength、minlength、required 以及 patt...

    XiNGRZ 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<