成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

納尼,Java 存在內存泄泄泄泄泄泄漏嗎?

開發 開發工具
納尼,Java 不是自動管理內存嗎?怎么可能會出現內存泄泄泄泄泄泄漏!

[[266265]]

 01. 怎么回事?

納尼,Java 不是自動管理內存嗎?怎么可能會出現內存泄泄泄泄泄泄漏!

[[266266]]

 

Java 最牛逼的一個特性就是垃圾回收機制,不用像 C++ 需要手動管理內存,所以作為 Java 程序員很幸福,只管 New New New 即可,反正 Java 會自動回收過期的對象。。。

那么 Java 都自動管理內存了,那怎么會出現內存泄漏,難道 Jvm 有 bug? 不要急,且聽我慢慢道來。。

02. 怎么判斷可以被回收

先了解一下 Jvm 是怎么判斷一個對象可以被回收。一般有兩種方式,一種是引用計數法,一種是可達性分析。

引用計數法:每個對象有一個引用計數屬性,新增一個引用時計數加1,引用釋放時計數減1,計數為0時可以回收。

這個辦法看起來挺簡單的,但是如果出現 A 引用了 B,B 又引用了 A,這時候就算他們都不再使用了,但因為相互引用 計算器=1 永遠無法被回收。

此方法簡單,無法解決對象相互循環引用的問題。

 

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

 

可達性分析可以解決循環引用的問題。

那么 gc roots 對象是哪些呢

  • 虛擬機棧中引用的對象
  • 方法區中類靜態屬性引用的對象
  • 方法區中常量引用的對象
  • 本地方法棧中JNI[即一般說的Native]引用的對象

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

03. 什么情況下會出現內存泄漏

既然可達性分析好像已經很牛逼的樣子了,怎么可能還會出現內存泄漏呢,那我們再來看一下內存泄漏的定義。

內存泄露就是指一個不再被程序使用的對象或變量一直被占據在內存中。

有可能此對象已經不使用了,但是還有其它對象保持著此對象的引用,就會導致 GC 不能回收此對象,這種情況下就會出現內存泄漏。

寫一個程序讓出現內存泄漏

①長生命周期的對象持有短生命周期對象的引用就很可能發生內存泄露,盡管短生命周期對象已經不再需要,但是因為長生命周期對象持有它的引用而導致不能被回收。

  1. public class Simple { 
  2.     Object object; 
  3.     public void method1(){ 
  4.         object = new Object(); 
  5.         //...其他代碼 
  6.     } 

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

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

  1. public class Simple { 
  2.     Object object; 
  3.     public void method1(){ 
  4.         object = new Object(); 
  5.         //...其他代碼 
  6.         object = null
  7.     } 

當然大家有可能會想就這一個方法也不會有多大影響,但如果在某些項目中,一個方法在一分鐘之內調用上萬次的時候,就會出現很明顯的內存泄漏現象。

②集合中的內存泄漏,比如 HashMap、ArrayList 等,這些對象經常會發生內存泄露。比如當它們被聲明為靜態對象時,它們的生命周期會跟應用程序的生命周期一樣長,很容易造成內存不足。

下面給出了一個關于集合內存泄露的例子。

  1. Vector v=new Vector(10); 
  2. for (int i=1;i<100; i++) 
  3.     Object o=new Object(); 
  4.     v.add(o); 
  5.     o=null
  6. //此時,所有的Object對象都沒有被釋放,因為變量v引用這些對象。 

在這個例子中,我們循環申請 Object 對象,并將所申請的對象放入一個 Vector 中,如果我們僅僅釋放引用本身,那么 Vector 仍然引用該對象,所以這個對象對 GC 來說是不可回收的。

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

以上兩種是最常見的內存泄漏案例。當然還有一些內存泄漏的例子,這里就不再一一例舉了,感興趣的同學可以在網上找找資料。

04. 內存泄漏和內存溢出

很多同學總是搞不清楚,內存泄漏和內存溢出的區別,它倆是兩個完全不同的概念, 它們之間存在一些關聯。

  • 內存溢出 out of memory,是指程序在申請內存時,沒有足夠的內存空間供其使用,出現 out of memory;
  • 內存泄露 memory leak,是指程序在申請內存后,無法釋放已申請的內存空間,一次內存泄露危害可以忽略,但內存泄露堆積后果很嚴重,無論多少內存,遲早會被占光。

所以內存泄漏可能會導致內存溢出,但內存溢出并不完全都是因為內存泄漏,也有可能使用了太多的大對象導致。

05. 如何檢測內存泄漏

***一個重要的問題,就是如何檢測 Java 的內存泄漏。目前,我們通常使用一些工具來檢查 Java 程序的內存泄漏問題。

市場上已有幾種專業檢查 Java 內存泄漏的工具,它們的基本工作原理大同小異,都是通過監測 Java 程序運行時,所有對象的申請、釋放等動作,將內存管理的所有信息進行統計、分析、可視化。開發人員將根據這些信息判斷程序是否有內存泄漏問題。

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

06. ***

以上內容其實是我曾經經常面試的內容之一,通過一系列的問題考察 Java 程序員對 Jvm 的理解。

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

如果面試者可以回答上面的問題,我會接著和面試者聊聊,內存泄漏和內存溢出他們之間是否存在聯系 、以及在日常工作中如何避免寫出內存泄漏的代碼 、如果生產出現 Jvm 相關問題時,排查問題的思路和步驟等等。

【本文為51CTO專欄作者“純潔的微笑”的原創稿件,轉載請通過微信公眾號聯系作者獲取授權】

 

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 純潔的微笑
相關推薦

2012-08-09 15:02:26

Windows 8操作系統

2012-08-15 13:50:41

Windows PhoWindows PhoWP

2014-11-04 10:57:52

2011-09-15 16:53:57

信息防泄

2012-07-19 11:27:11

2011-03-07 10:24:31

數據中心Nexus3000思科

2012-01-09 11:07:21

2017-06-06 16:42:22

2011-11-17 15:44:23

IP-guard夏普

2011-06-23 10:41:09

2011-12-31 16:26:34

三重保護信息防泄漏IP-guard

2015-07-31 17:30:36

官吹

2013-12-10 10:37:55

服務器漏洞摩根大通服務器

2016-11-01 09:02:36

數據獻血者紅十字

2014-10-08 10:24:33

2012-02-06 13:15:37

IP-guard三重保信息防泄漏溢信科技

2021-06-11 10:48:53

金融APP數據泄露漏洞

2009-02-09 17:18:46

WindowsMobile 6.5 泄露

2013-01-06 10:40:30

網絡管理數據安全

2016-01-25 10:20:18

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区av在线 | 久久久久久精 | 国产日韩一区二区三区 | 欧美激情视频一区二区三区在线播放 | 欧美人妇做爰xxxⅹ性高电影 | 久久高清亚洲 | 色综合激情 | 欧美中文字幕一区二区三区 | 精品国产欧美日韩不卡在线观看 | 亚洲深夜福利 | 免费欧美| 国产高清视频一区 | 国产精品国产三级国产aⅴ中文 | 亚洲一区视频 | 久久五月婷| 久久久成人一区二区免费影院 | www.一级毛片| 国产一区二区在线免费视频 | 国产农村妇女精品一二区 | 亚洲国产成人精品女人久久久野战 | 最新免费av网站 | 麻豆一区二区三区精品视频 | 精品福利在线 | 九九热在线视频 | 国产精品久久久久久久久久久久久 | 欧美在线视频一区二区 | 国产一级电影网 | 国产一区二 | 成人深夜小视频 | 国产精品视频一区二区三区四区国 | 国产精品视频免费观看 | 在线观看黄色大片 | 久久99国产精一区二区三区 | 国产成人精品久久二区二区91 | 亚洲福利一区二区 | 日韩一区中文字幕 | 国产精品永久久久久久久www | 午夜在线视频一区二区三区 | 久久精品屋 | 日韩视频91 | 亚洲91视频 |