如圖,jmap打出的heap中,同時出現了[C和String。
有點奇怪的是,String本身是用final char[]來保存的,這里同時列出來,意味著[C的實例數和內存占用是包括String的,還是說String是單獨統(tǒng)計的?
String實際占用的內存應是上圖的String+[C的才對.
為驗證這個我寫了個小程序
import java.io.*;
import java.util.*;
public class MemoryMap {
static long bytes = 0;
public static void main(String[] args) throws IOException { // Line 1
Set<String> opt = new HashSet<String>();
opt.addAll(Arrays.asList(args));
List<String> list= new ArrayList< String>();
if (opt.contains("alloc")) {
for (int i = 0; i < 100; i++) {
String s = foo(1024 * 1024, i); //100Mb
bytes += s.getBytes().length;
list.add(s);
}
}
System.out.println("Bytes=" + bytes + ", press Enter to exit...");
InputStreamReader in = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(in);
if(opt.contains("gc")){
System.gc();
}
String a = br.readLine();
System.out.println(a);
System.out.println(list.size());
}
private static String foo(long count, int k) { // Line 6
StringBuffer sb = new StringBuffer();
for (int i = 0; i < count; i++) {
sb.append(i % 10);
}
sb.append(k);
return sb.toString();
}
}
編譯
javac MemoryMap.java
分別運行
java MemoryMap alloc gc
和
java MemoryMap gc
并另打開一個終端窗口分別查看
分配100M+字符的情況
? $ jps
12426 MemoryMap
12428 Jps
? $ jmap -histo 12426
num #instances #bytes class name
----------------------------------------------
1: 1160 209829280 [C
2: 92 9702688 [I
3: 485 55304 java.lang.Class
4: 11 33232 [B
5: 1147 27528 java.lang.String
6: 525 26424 [Ljava.lang.Object;
7: 79 5688 java.lang.reflect.Field
不分配的情況
? $ jmap -histo 12912
num #instances #bytes class name
----------------------------------------------
1: 92 685024 [I
2: 1038 110832 [C
3: 485 55304 java.lang.Class
4: 14 33872 [B
5: 524 25968 [Ljava.lang.Object;
6: 1025 24600 java.lang.String
7: 79 5688 java.lang.reflect.Field
兩種情況字符串字節(jié)數相差27528-24600=2928
字符數組字節(jié)數相差209829280-110832=209718448
實際上100M+數字字符在內存占200M+字節(jié)
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數據專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產業(yè)為響應國家深化產教融合/校企合作的政策,積極推進“中國制造2025”,實現中華民族偉大復興的升級產業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯(lián)網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。