<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    stone2083

    獲得Java對象內存占用大小

    懶惰,直接上代碼,用法見JAVA DOC.
      1 package com.alibaba.stonelab.javalab.jvm.sizeof;
      2 
      3 import java.lang.instrument.Instrumentation;
      4 import java.lang.reflect.Array;
      5 import java.lang.reflect.Field;
      6 import java.lang.reflect.Modifier;
      7 import java.util.IdentityHashMap;
      8 import java.util.Map;
      9 import java.util.Stack;
     10 
     11 /**
     12  * <pre>
     13  * 1. MANIFEST.MF
     14  *      Premain-Class: xxx.yyy.zzz.JavaSizeOf
     15  * 
     16  * 2. MAIN.JAVA
     17  *         System.out.println(JavaSizeOf.sizeof(new ConcurrentHashMap<Object, Object>()));
     18  *         System.out.println(JavaSizeOf.sizeof(new String("1234567")));
     19  *         System.out.println(JavaSizeOf.sizeof(new String("1234")));
     20  *         System.out.println(JavaSizeOf.sizeof(new Object()));
     21  *         System.out.println(JavaSizeOf.sizeof(new int[] { 1, 2, 3 }));
     22  *         System.out.println(JavaSizeOf.sizeof(new CopyOnWriteArrayList<Object>()));
     23  *         System.out.println(JavaSizeOf.sizeof(null));
     24  *         
     25  * 3. USAGE:
     26  *      java -javaagent:sizeof.jar xxx.yyy.zzz.Main
     27  * </pre>
     28  * 
     29  * @author <a href="mailto:li.jinl@alibaba-inc.com">Stone.J</a> 2013-6-8
     30  */
     31 public class JavaSizeOf {
     32 
     33     private static Instrumentation inst;
     34 
     35     public static void premain(String agentArgs, Instrumentation inst) {
     36         JavaSizeOf.inst = inst;
     37     }
     38 
     39     /**
     40      * get size of java object.
     41      * 
     42      * @param o
     43      * @return
     44      */
     45     public static long sizeof(Object o) {
     46         assert inst != null;
     47         Map<Object, Object> visited = new IdentityHashMap<Object, Object>();
     48         Stack<Object> visiting = new Stack<Object>();
     49         visiting.add(o);
     50         long size = 0;
     51         while (!visiting.isEmpty()) {
     52             size += analysis(visiting, visited);
     53         }
     54         return size;
     55     }
     56 
     57     /**
     58      * analysis java object size recursively.
     59      * 
     60      * @param visiting
     61      * @param visited
     62      * @return
     63      */
     64     protected static long analysis(Stack<Object> visiting, Map<Object, Object> visited) {
     65         Object o = visiting.pop();
     66         if (skip(o, visited)) {
     67             return 0;
     68         }
     69         visited.put(o, null);
     70         // array.
     71         if (o.getClass().isArray() && !o.getClass().getComponentType().isPrimitive()) {
     72             if (o.getClass().getName().length() != 2) {
     73                 for (int i = 0; i < Array.getLength(o); i++) {
     74                     visiting.add(Array.get(o, i));
     75                 }
     76             }
     77         }
     78         // object.
     79         else {
     80             Class<?> clazz = o.getClass();
     81             while (clazz != null) {
     82                 Field[] fields = clazz.getDeclaredFields();
     83                 for (Field field : fields) {
     84                     if (Modifier.isStatic(field.getModifiers())) {
     85                         continue;
     86                     }
     87                     if (field.getType().isPrimitive()) {
     88                         continue;
     89                     }
     90                     field.setAccessible(true);
     91                     try {
     92                         visiting.add(field.get(o));
     93                     } catch (Exception e) {
     94                         assert false;
     95                     }
     96                 }
     97                 clazz = clazz.getSuperclass();
     98             }
     99         }
    100         return inst.getObjectSize(o);
    101     }
    102 
    103     /**
    104      * <pre>
    105      * skip statistics.
    106      * </pre>
    107      * 
    108      * @param o
    109      * @param visited
    110      * @return
    111      */
    112     protected static boolean skip(Object o, Map<Object, Object> visited) {
    113         if (o instanceof String) {
    114             if (o == ((String) o).intern()) {
    115                 return true;
    116             }
    117         }
    118         return o == null || visited.containsKey(o);
    119     }
    120 
    121 }
    122 

    posted on 2013-06-08 17:32 stone2083 閱讀(7856) 評論(1)  編輯  收藏 所屬分類: java

    Feedback

    # re: 獲得Java對象內存占用大小 2013-06-08 19:16 開發吧

    代碼很實用,謝謝!  回復  更多評論   

    主站蜘蛛池模板: 女人18毛片水真多免费看| 久久99国产乱子伦精品免费| 国产精品亚洲综合久久| 国产人成亚洲第一网站在线播放| 精品无码无人网站免费视频| 亚洲AV无码国产精品色午友在线| 亚洲男人的天堂在线| 亚洲AV无码成人精品区日韩| 好湿好大好紧好爽免费视频| 麻花传媒剧在线mv免费观看| 亚洲精品第一国产综合境外资源| 亚洲乱亚洲乱妇无码| 特级做A爰片毛片免费看无码| 免费观看国产网址你懂的| 午夜电影免费观看| 亚洲精品国产高清在线观看| 久久国产精品免费网站| 日本特黄特黄刺激大片免费| 亚洲Av熟妇高潮30p| 色费女人18女人毛片免费视频| 亚洲一区二区在线免费观看| 亚洲日韩国产成网在线观看| 亚洲国产91在线| 久久久国产精品无码免费专区| 久久久无码精品亚洲日韩按摩 | 亚洲一区二区三区首页| 亚洲免费在线视频观看| 亚洲午夜成人精品无码色欲| 国产一级片免费看| 亚洲日韩欧洲无码av夜夜摸| 亚洲av无码专区在线观看亚| 亚洲中文字幕视频国产| 67194成手机免费观看| 亚洲国产成人精品无码区花野真一| 亚洲色图综合在线| 久草视频免费在线观看| 亚洲AV本道一区二区三区四区| 国产在线a免费观看| 亚洲一区二区免费视频| 91久久精品国产免费直播| 国产亚洲综合视频|