在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ jmap輸出中[C與String的區(qū)別

jmap輸出中[C與String的區(qū)別

clipboard.png
如圖,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é)

2017年10月15日 00:24