熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java進階:討論關於Java占用內存的研究[2]

2013-11-23 19:38:57  來源: Java核心技術 

  對於數組我們不是直接可以取length屬性麼源於此

  public byte[] bytes=new byte[];
  Systemoutprintln(byteslength); // 看有length屬性

  上面的bytes換算過來是

  public class Array {
  public int length;
  public byte byte;
  public byte byte;
  
  public byte byte;
  }

  上面的bytes占用的內存是

  +[+ + *] = + []=+=

  是 bytes這個引用是Object基占的是length屬性占的個成員占的本來是 但要求是的倍數變成 總共是

  再如

  byte[] bytes=new byte[];

  的內存占用是:

  +[++*]=+[]=;
  byte[] bytes=new byte[]; 也是

  對於元素是Object的數組Object也是當作其成員(注意只有引用這個數組的空間這個可以推到普通Class上)

  Byte[] bytes=new Byte[];

  這個 bytes的定義相當於:

  public class Array {
  public int length;
  public Byte byte;
  
  public Byte byte;
  }

  占用空間是

  +[++*]+*= + + = 你自己算吧

  推論千萬不要用 Byte[] 有倍的差距!你可能一下子沒明白過來沒關系多琢磨一下對於普通的class來說內容占用就是基加成員的占用Object成員只記引用

  public class Abc {
  public int n;
  public byte b;
  public Object obj;
  }

  它的內容占用是 [+++]=

  所以 Abc one=new Abc()的占用是 +=

  提醒對於 Abc的成員 obj沒有計如果要計入的話循環這個過程就可以了(琢磨一下)

  舉例

  public class Abc {
  public byte b;
  public Object obj=null;
  }

  public class Def {
  public int n;
  public byte b;
  public Abc obj=new Abc();
  }

  問Def one=new Def(); //占多少?

  答+[+++]+[++]=++=
  public class Abc {
  public byte b;
  public Object obj=null;
  }
  public class Def {
  public int n;
  public byte b;
  public Abc[] objs=new Abc[];
  {
  for(int i=;i<;i++) {
  objs[i]=new Abc();
  }
  }
  }

  問Def one=new Def(); //占多少?

  答kao一下我也算不出來不過我寫了程序可以算出來你給它一個Object它就能遞歸的算出總共占了多少內存這個程序不復雜你也可以寫出來我等機會合適了再放出單獨說一下StringString的結構是

  public class String {
  private final char value[];
  private final int offset;
  private final int count;
  private int hash; // Default to
  }

  所以不考慮那個char[]的占用一個String最少占用 [++++]=bytes 加上引用bytes 所以

  String s=;

  占用bytes!!!!! 盡管它的長度為如果精確的算加上引用一個String的占用是

  ++[++*length]
  String s=; 的占用是 +=
  String s=ab 的占用是 +=
  String s=abc 的占用是 + =

  要說的是String是常用的類這麼看String耗內存很多所以jvm有優化同樣的內容盡量重用所以除了是必須的外那個char[] 很可能一樣比方說

  String[] s=new String[];
  for(int i=;i<;i++) {
  s[i]=new String(abcdefasdjflksadjflkasdfj);
  }

  的占用的數量級是 *個字符串本身基本上不占內存只有一份!反正String 至少是 最多也可能是!比較占內存的數據結構這個很重要基本上就是 primitive的包裝

  實例

  我以前用一個

  Hashtable的結構萬個元素改為String[]+int[]後內存占用改觀不少速度也很快萬的String[] 快排一下也就秒多查找用和hash也差不多少

[]  []  


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27227.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.