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

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

2022-06-13   來源: Java核心技術 

  最近對程序占用內存方面做了一些優化取得了不錯的效果總結了一些經驗

  簡要說一下相信會對大家寫出優質的程序有所幫助

  下面的論述針對位系統位系統不適用後敘經常你寫了一個程序一測試功能沒問題一看內存占用也不多就不去考慮其它的東西了但可能程序使用了一個什麼數據結構會當數據規模變大時內存占用激增

  基本&&關鍵的問題是Java裡各種東東占多少內存?

  對於primitive類型byte short int long float double char boolean 它們的長度分別是

  這個不羅嗦了舉例來說

  long[] data=new long[];

  占用內存 * bytes

  此外data本身是一個Object也占用內存若干後敘當然它針對 *來說忽略不計再說Object的占用在說這個之前先說說引用一慣的說法是Java裡沒有指針了只有引用引用是安全的

  這個說法沒錯但是從機理上來說引用就是指針只是jvm對指針的使用檢查和限制很多這個引用/指針變得很安全

   直接來結論一個引用占byte 位系統上

  Object obj=null; //byte
  Object[] objs=new Object[]; //至少*byte

  你看我定義了一個 obj還是null就占byte

  定義了一個 objs個元素但都是null啊就都每個占byte

  雖然obj==null但它已經是 一個引用或者說一個指針了

  指針也要占地方

  接下來直接給另一個結論 Object占byte注意純Object

  Object obj=new Object(); //多少????

  byte?? 錯!! byte忘了還有一個引用byte是Object的內容

  記住 Object obj=new Object(); 占byte

  Object[] objs=new Object[];
  for(int i=;i<;i++) {
  objs[i]=new Object();
  }

  至少占用 * bytes

  推論 Object占bytes似乎和上面的結論矛盾??!!

  沒有!! 不管Object沒有被垃圾回收之前總得被別人引用吧?總的有指針指它吧? 既然指那個引用or指針就要占地方啊 byte加起來是byte反正一個Object至少 bytes還是直接給結論推導的過程我就都包辦了咱不是髒活累活搶著干麼!!

  一個Integer占 bytes

  這時您可能會有疑問Integer=Object+int就是

  public class Integer {
  public int value;
  }

  Integer應該占 += bytes啊

  你說的有道理但是jvm對所有的Object有限制!這個限制被我發現了就是不管什麼Object占的空間要是的倍數不是的倍數只能是了!

  推論Byte也占bytes!

  問Byte[] bytes=new Byte[];占用空間多少?

  答 約為(至少為) (+)* bytes

  論題數組空間占用怎麼算?

  我這裡直接給結論了推導這個花了更長的時間對於數組來說數組這個Object有一個length屬性數組的元素相當於其成員

  public class Array {
  public int length;
  // 其它成員
  }

[]  []  


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