乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      java 垃圾回收總結(jié)(1)

       小豬窩969 2015-09-09

      以前看過很多次關(guān)于垃圾回收相關(guān)的文章,都只是看過就忘記了,沒有好好的整理一下,發(fā)現(xiàn)寫文章可以強(qiáng)化自己的記憶。


       


      java與C,c++有很大的不同就是java語言開發(fā)者不需要關(guān)注內(nèi)存信息,不會顯式的直接操作內(nèi)存,而是通過jvm虛擬機(jī)來實(shí)現(xiàn)。


      java虛擬機(jī)運(yùn)行的時(shí)候內(nèi)存分配圖如下圖:


      1


       


      jvm虛擬機(jī)棧:一個(gè)是線程獨(dú)有的,每次啟動一個(gè)線程,就創(chuàng)建一個(gè)jvm虛擬機(jī)棧,線程退出的時(shí)候就銷毀。這里面主要保存線程本地變量名和局部變量值。


      本地方法棧: 調(diào)用本地jni方法的時(shí)候而創(chuàng)建的。這里分配的jvm之外的內(nèi)存空間。方法調(diào)用結(jié)束之后銷毀。


      pc寄存器 : 這個(gè)保存線程當(dāng)前執(zhí)行的字節(jié)碼指令


      堆:主要保存創(chuàng)建的對象。


      方法區(qū):保存class相關(guān)的信息。主要是class的一個(gè)內(nèi)存結(jié)構(gòu)信息


      常量池:方法區(qū)的一部分,主要保存class內(nèi)存結(jié)構(gòu)中常量值 例如String值,public static final 類型的值


       


      我們這里說的垃圾回收,主要是java虛擬機(jī)對堆內(nèi)存區(qū)域的回收。


       


      1 首先的問題是:jvm如何知道那些對象需要回收 ?


      目前有兩種算法



      • 引用計(jì)數(shù)法



      每個(gè)對象上都有一個(gè)引用計(jì)數(shù),對象每被引用一次,引用計(jì)數(shù)器就+1,對象引用被釋放,引用計(jì)數(shù)器-1,直到對象的引用計(jì)數(shù)為0,對象就標(biāo)識可以回收


      這個(gè)可以用數(shù)據(jù)算法中的圖形表示,對象A-對象B-對象C 都有引用,所以不會被回收,對象B由于沒有被引用,沒有路徑可以達(dá)到對象B,對象B的引用計(jì)數(shù)就就是0,對象B就會被回收。


       


       2




      但是這個(gè)算法有明顯的缺陷,對于循環(huán)引用的情況下,循環(huán)引用的對象就不會被回收。例如下圖:對象A,對象B 循環(huán)引用,沒有其他的對象引用A和B,則A和B 都不會被回收。


       3




      • root搜索算法



      這種算法目前定義了幾個(gè)root,也就是這幾個(gè)對象是jvm虛擬機(jī)不會被回收的對象,所以這些對象引用的對象都是在使用中的對象,這些對象未使用的對象就是即將要被回收的對象。簡單就是說:如果對象能夠達(dá)到root,就不會被回收,如果對象不能夠達(dá)到root,就會被回收。




      如下圖:對象D訪問不到根對象,所以就會被回收


      4




      以下對象會被認(rèn)為是root對象:



      • 被啟動類(bootstrap加載器)加載的類和創(chuàng)建的對象

      • jvm運(yùn)行時(shí)方法區(qū)類靜態(tài)變量(static)引用的對象

      • jvm運(yùn)行時(shí)方法去常量池引用的對象

      • jvm當(dāng)前運(yùn)行線程中的虛擬機(jī)棧變量表引用的對象

      • 本地方法棧中(jni)引用的對象




      由于這種算法即使存在互相引用的對象,但如果這兩個(gè)對象無法訪問到根對象,還是會被回收。如下圖:對象C和對象D互相引用,但是由于無法訪問根,所以會被回收。


      5




      jvm在確定是否回收的對象的時(shí)候采用的是root搜索算法來實(shí)現(xiàn)。



      在root搜索算法的里面,我們說的引用這里都指定的是強(qiáng)引用關(guān)系。所謂強(qiáng)引用關(guān)系,就是通過用new 方式創(chuàng)建的對象,并且顯示關(guān)聯(lián)的對象


      1
      Object obj = new Object();

      以上就是代表的是強(qiáng)引用關(guān)系,變量obj 強(qiáng)引用了 Object的一個(gè)對象。


      java里面有四種應(yīng)用關(guān)系,從強(qiáng)到弱分別為:


      Strong Reference(強(qiáng)引用) –>Weak Reference (弱引用) -> Soft Reference(軟引用) – > Phantom Reference(引用)


       


      Strong Reference : 只有在引用對象root不可達(dá)的情況下才會標(biāo)識為可回收,垃圾回收才可能進(jìn)行回收


      Weak Reference :即使在root算法中 其引用的對象root可達(dá)到,但是如果jvm堆內(nèi)存 不夠的時(shí)候,還是會被回收。


      Soft Reference : 無論其引用的對象是否root可達(dá),在響應(yīng)內(nèi)存需要時(shí),由垃圾回收判斷是否需要回收。


      Phantom Reference :在回收器確定其指示對象可另外回收之后,被加入垃圾回收隊(duì)列.


       


      下面可以看一個(gè)測試


      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      public class ReferenceTest {
          public static final Map<Integer, Reference> map = new HashMap<Integer, Reference>();
          public static void main(String[] args) {
              for (int i = 0; i < 1000; i++) {
                  map.put(i, new WeakReference(new ReferenceObject(i)));
              }
              int i = 0;
              for (Reference r : map.values()) {
                  if (r.get() == null) {
                      i++;
                  }
              }
              System.out.println("被回收的對象數(shù):" + i);
          }
          static class ReferenceObject {
              private int    i;
              private byte[] b;
              public ReferenceObject(int i) {
                  this.i = i;
                  b = new byte[1024 *10];
              }
          }
      }

      這里創(chuàng)建大約1000個(gè) 10K的 Weak Reference 對象,最后打印的結(jié)果是:被回收的對象數(shù):767,這里ReferenceObject如果設(shè)置為1K的話,最后的打印結(jié)果是0


      這個(gè)例子并不嚴(yán)謹(jǐn),但是卻說明了被Weak Reference的對象在一定的時(shí)候會被jvm回收,但是強(qiáng)引用就不會出現(xiàn)這種狀態(tài)。

        本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多