Java不同資料結構記憶體消耗比較
測試不同儲存方式對記憶體的消耗情況:
<span style="font-size:14px;">package bfs;
import java.util.HashSet;
import java.util.TreeMap;
public class MemStatistic {
public static void main(String[] args) {
// BlockingQueue<Integer> queue = new LinkedBlockingQueue<Integer>();
Runtime rt = Runtime.getRuntime();
System.out.println("Total Memory = " + rt.totalMemory() + " Used Memory = " + (rt.totalMemory() - rt.freeMemory()));
int verticesSize = 5000000 ;
/**
* 陣列部分記憶體開銷測試
*/
Vertex vertices[] = new Vertex[verticesSize] ;
int[] edges = new int[verticesSize] ;
boolean[] visited = new boolean[verticesSize];
for(int i = 0 ; i<verticesSize ; i++){
vertices[i] = new Vertex(i,i + (i*3)%100, 1) ;
}
for(int j =0 ;j<verticesSize ; j++){
edges[j] = j;
visited[j] = true ;
}
<span style="white-space:pre"> </span> /**
<span style="white-space:pre"> </span> * 連結串列部分記憶體開銷測試
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span> ArrayList<Vertex> verticesList = new ArrayList<Vertex>() ;
<span style="white-space:pre"> </span> int[] edges = new int[verticesSize] ;
<span style="white-space:pre"> </span> boolean[] visited = new boolean[verticesSize];
<span style="white-space:pre"> </span> for(int i = 0 ; i<verticesSize ; i++){
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>verticesList.add(new Vertex(i,i + (i*3)%100, 1)) ;
<span style="white-space:pre"> </span> }
/**
* TreeMap部分記憶體開銷測試
*/
// TreeMap<Integer, HashSet<Integer>> vertices2 = new TreeMap<Integer, HashSet<Integer>>() ;
// for(int i = 0 ; i<verticesSize ; i++){
// HashSet<Integer> values = new HashSet<Integer>() ;
// values.add(i + (i*3)%100) ;
// vertices2.put(i, values) ;
// }
/**
* TreeMap部分記憶體開銷測試
*/
// TreeMap<Integer, String> vertices3 = new TreeMap<Integer, String>() ;
// for(int i = 0 ; i<verticesSize ; i++){
// Integer r = i + (i*3)%100 ;
// String values =r.toString() ;
// vertices3.put(i, values) ;
// }
System.out.println("Total Memory = " + rt.totalMemory() + " Used Memory = " + (rt.totalMemory() - rt.freeMemory()));
}
}
class Vertex{
public int id ; //頂點值
public int start ; //edges陣列中邊的起始位置
public int edgeNo; //該頂點的邊數目
public Vertex( int iD, int x, int y){
id = iD;
start = x ;
edgeNo = y ;
}
public String toString(){
return new String(id+":"+start+"-"+edgeNo) ;
}
}</span>
結果1,2,3分別是:
500萬個點:
Total Memory = 127991808 Used Memory = 669888
Total Memory = 399310848 Used Memory = 165807688 約165M
Total Memory = 127991808 Used Memory = 669888
Total Memory = 1809711104 Used Memory = 1283182952 約1.28G
Total Memory = 127991808 Used Memory = 669888
Total Memory = 842203136 Used Memory = 562868512 約562M
第一種消耗的記憶體只有165M, 真少啊 !!!! 連結串列的開銷略高於它,約為186M.
此外,發現TreeMap比HashMap消耗的記憶體略少些,好東西啊!
下面是之前做過的測試: 1000萬條邊,約160M大小檔案。
使用TreeMap<Integer, HashSet<Integer>>儲存,結果
使用eclipse Memeory Analyzer分析,Map佔了大部分記憶體,約1G空間:
相關文章
- 資料結構比較資料結構
- 如何比較兩個資料庫表結構的不同資料庫
- 磁碟資料庫與記憶體資料庫的特點比較資料庫記憶體
- JVM記憶體結構、Java記憶體模型和Java物件模型JVM記憶體Java模型物件
- Postgresql資料庫體系結構-程式和記憶體結構SQL資料庫記憶體
- Oracle - 資料庫的記憶體結構Oracle資料庫記憶體
- 瀚高資料庫記憶體結構資料庫記憶體
- Redis記憶體——記憶體消耗(記憶體都去哪了?)Redis記憶體
- JVM結構-記憶體結構(執行時資料區)JVM記憶體
- 記憶體洩漏與記憶體溢位神比較記憶體溢位
- JAVA的記憶體模型及結構Java記憶體模型
- 如何定義一個自帶資料區的結構體:三種資料結構體的比較結構體資料結構
- 記憶體結構記憶體
- 淺談JVM記憶體結構 和 Java記憶體模型 和 Java物件模型JVM記憶體Java模型物件
- LOGMINER的記憶體消耗記憶體
- JVM讀書筆記之java記憶體結構JVM筆記Java記憶體
- PostgreSQL:記憶體結構SQL記憶體
- oracle 記憶體結構Oracle記憶體
- JVM記憶體結構JVM記憶體
- Oracle體系結構之-記憶體結構Oracle記憶體
- 不同Java垃圾回收器的比較Java
- 資料結構-棧&佇列&Deque實現比較資料結構佇列
- JVM系列之Java記憶體結構詳解JVMJava記憶體
- 採用java連結timesten記憶體資料庫Java記憶體資料庫
- 結構體記憶體對齊結構體記憶體
- Oracle記憶體體系結構Oracle記憶體
- 構建個人記憶體資料庫記憶體資料庫
- 【基礎篇記憶體結構】oracle10g記憶體結構(一)記憶體Oracle
- 無鎖資料結構(基礎篇):記憶體柵障資料結構記憶體
- oracle 記憶體結構(二)Oracle記憶體
- 調節記憶體結構記憶體
- Oracle 記憶體結構(一)Oracle記憶體
- ORACLE 記憶體結構理解.Oracle記憶體
- Oracle體系結構:記憶體結構和程式結構(轉)Oracle記憶體
- 不同的Java垃圾回收器的比較Java
- Oracle體系結構之記憶體結構(SGA、PGA)Oracle記憶體
- 資料管理架構:單體資料架構與分散式資料網格比較 - enyo架構分散式
- MySQL整體架構與記憶體結構MySql架構記憶體