• 搞定Hotspot-api


    目的,搞这玩意儿,无非想学习下hotspot中的java对象体系。恩直接上代码吧。

    做了一个工程:

    待观察类:

    package hotspot.api.test;
    
    /**
     * hotspot 观察类
     * @author 
     *
     */
    public class Wukong {
        public static int wk_static_i = 7777777;
        private int wk_instance_i;
        
        public Wukong(int wk_instance_i) {
            this.wk_instance_i = wk_instance_i;
        }
        public int getWk_instance_i() {
            return wk_instance_i;
        }
    }

    运行线程:

    package hotspot.api.test;
    
    import java.io.IOException;
    
    public class WukongRun {
        
        public static void main(String args[]){
            new Wukong(8888);
            try {
                System.in.read();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }

    attach工具:

    package hotspot.api.test;
    
    import sun.jvm.hotspot.oops.HeapVisitor;
    import sun.jvm.hotspot.oops.Klass;
    import sun.jvm.hotspot.oops.ObjectHeap;
    import sun.jvm.hotspot.oops.Oop;
    import sun.jvm.hotspot.oops.OopPrinter;
    import sun.jvm.hotspot.runtime.VM;
    
    public class HotspotApiTest extends sun.jvm.hotspot.tools.Tool {
    
        public static void main(String args[]) {
            HotspotApiTest ht = new HotspotApiTest();
            ht.start(args);
            ht.stop();
        }
    
        @Override
        public void run() {
            VM vm = VM.getVM();
            final ObjectHeap objectHeap = vm.getObjectHeap();
            objectHeap.iterate(new HeapVisitor() {
                @Override
                public void prologue(long l) {
                }
    
                @Override
                public boolean doObj(Oop oop) {
                    System.out.println("////////////////////////////////////////");
                    System.out.println("OOP#" + oop);
                    oop.iterate(new OopPrinter(System.out), true);
                    System.out.println("////////////////////////////////////////");
                    System.out.println("OOP.KLASS#" + oop.getKlass());
                    oop.getKlass().iterate(new OopPrinter(System.out), true);
                    System.out.println("////////////////////////////////////////");
                    System.out.println("OOP.KLASS.MIRROR#" + oop.getKlass().getJavaMirror());
                    oop.getKlass().getJavaMirror().iterate(new OopPrinter(System.out), true);
                    System.out.println("////////////////////////////////////////");
                    System.out.println("OOP.KLASS.KLASS#" + oop.getKlass().getKlass());
                    oop.getKlass().getKlass().iterate(new OopPrinter(System.out), true);
                    System.out.println("////////////////////////////////////////");
                    System.out.println("OOP.KLASS.KLASS.KLASS#" + oop.getKlass().getKlass().getKlass());
                    oop.getKlass().getKlass().getKlass().iterate(new OopPrinter(System.out), true);
                    System.out.println("////////////////////////////////////////");
                    System.out.println("OOP.KLASS.KLASS.KLASS.KLASS#" + oop.getKlass().getKlass().getKlass().getKlass());
                    oop.getKlass().getKlass().getKlass().getKlass().iterate(new OopPrinter(System.out), true);
                    return false;
                }
    
                @Override
                public void epilogue() {
                }
    
            }, new ObjectHeap.ObjectFilter() {
                @Override
                public boolean canInclude(Oop oop) {
                    Klass klass = oop.getKlass();
                    return klass.getName() != null && "hotspot/api/test/Wukong".equals(klass.getName().asString());
                }
            });
        }
    
    }

    首先把代码编译一下:

    javac -cp /home/software/jdk1.7.0_80/lib/sa-jdi.jar -d bin -sourcepath src src/main/java/hotspot/api/test/*.java

    这里边要用到sa-jdi.jar这个包;eclipse下需要专门在jre配置里导入这个包才能正常编译。

    然后先到bin目录下执行:

    java hotspot.api.test.WukongRun

    新开窗口,执行:

    java -classpath /home/software/jdk1.7.0_80/lib/sa-jdi.jar: hotspot.api.test.HotspotApiTest 3475

    3475就是上边WukongRun的线程id。

    输出结果:

    ////////////////////////////////////////
    OOP#sun.jvm.hotspot.oops.Instance@ef44eb00
    Oop for hotspot/api/test/Wukong @ 0x00000000ef44eb00 (object size = 16)
     - _mark:     {0} :1
     - _metadata._compressed_klass:     {8} :InstanceKlass for hotspot/api/test/Wukong @ 0x00000000fb062e60
     - wk_instance_i:     {12} :8888
    
    ////////////////////////////////////////
    OOP.KLASS#sun.jvm.hotspot.oops.InstanceKlass@fb062e60
    InstanceKlass for hotspot/api/test/Wukong @ 0x00000000fb062e60 (object size = 568)
     - _mark:     {0} :1
     - _metadata._compressed_klass:     {8} :InstanceKlassKlass @ 0x00000000fae00270
     - _java_mirror:     {120} :Oop for java/lang/Class @ 0x00000000ef44eaa0
     - _super:     {128} :InstanceKlass for java/lang/Object @ 0x00000000fae02bb0
     - _layout_helper:     {24} :16
     - _access_flags:     {156} :33
     - _subklass:     {136} :null
     - _next_sibling:     {144} :InstanceKlass for java/lang/Void @ 0x00000000fb0627c0
     - _alloc_count:     {160} :0
     - _array_klasses:     {200} :null
     - _methods:     {208} :ObjArray @ 0x00000000fb062bd0
     - _method_ordering:     {216} :[I @ 0x00000000fae01c30
     - _local_interfaces:     {224} :ObjArray @ 0x00000000fae01c40
     - _transitive_interfaces:     {232} :ObjArray @ 0x00000000fae01c40
     - _fields:     {240} :[S @ 0x00000000fb062ba8
     - _constants:     {248} :ConstantPool for hotspot/api/test/Wukong @ 0x00000000fb062a70
     - _class_loader:     {256} :Oop for sun/misc/Launcher$AppClassLoader @ 0x00000000ef442c58
     - _protection_domain:     {264} :Oop for java/security/ProtectionDomain @ 0x00000000ef44c568
     - _signers:     {272} :null
     - _inner_classes:     {280} :[S @ 0x00000000fae01c20
     - _nonstatic_field_size:     {360} :1
     - _static_field_size:     {364} :1
     - _static_oop_field_count:     {368} :0
     - _nonstatic_oop_map_size:     {372} :0
     - _is_marked_dependent:     {376} :0
     - _init_state:     {498} :5
     - _vtable_len:     {392} :6
     - _itable_len:     {396} :2
    
    ////////////////////////////////////////
    OOP.KLASS.MIRROR#sun.jvm.hotspot.oops.Instance@ef44eaa0
    Oop for java/lang/Class @ 0x00000000ef44eaa0 (object size = 96)
     - _mark:     {0} :1
     - _metadata._compressed_klass:     {8} :InstanceKlass for java/lang/Class @ 0x00000000fae160c0
     - cachedConstructor:     {12} :null
     - newInstanceCallerCache:     {16} :null
     - name:     {20} :null
     - classLoader:     {24} :Oop for sun/misc/Launcher$AppClassLoader @ 0x00000000ef442c58
     - reflectionData:     {28} :null
     - classRedefinedCount:     {72} :0
     - genericInfo:     {32} :null
     - enumConstants:     {36} :null
     - enumConstantDirectory:     {40} :null
     - annotations:     {44} :null
     - declaredAnnotations:     {48} :null
     - lastAnnotationsRedefinedCount:     {76} :0
     - annotationType:     {52} :null
     - classValueMap:     {56} :null
    Oop for java/lang/Class @ 0x00000000ef44eaa0 (object size = 96)
     - wk_static_i:     {88} :7777777
    
    
    ////////////////////////////////////////
    OOP.KLASS.KLASS#sun.jvm.hotspot.oops.InstanceKlassKlass@fae00270
    InstanceKlassKlass @ 0x00000000fae00270 (object size = 208)
     - _mark:     {0} :1
     - _metadata._compressed_klass:     {8} :KlassKlass @ 0x00000000fae00000
     - _java_mirror:     {120} :null
     - _super:     {128} :null
     - _layout_helper:     {24} :0
     - _access_flags:     {156} :0
     - _subklass:     {136} :null
     - _next_sibling:     {144} :null
     - _alloc_count:     {160} :0
    
    ////////////////////////////////////////
    OOP.KLASS.KLASS.KLASS#sun.jvm.hotspot.oops.KlassKlass@fae00000
    KlassKlass @ 0x00000000fae00000 (object size = 208)
     - _mark:     {0} :1
     - _metadata._compressed_klass:     {8} :KlassKlass @ 0x00000000fae00000
     - _java_mirror:     {120} :null
     - _super:     {128} :null
     - _layout_helper:     {24} :0
     - _access_flags:     {156} :0
     - _subklass:     {136} :null
     - _next_sibling:     {144} :null
     - _alloc_count:     {160} :0
    
    ////////////////////////////////////////
    OOP.KLASS.KLASS.KLASS.KLASS#sun.jvm.hotspot.oops.KlassKlass@fae00000
    KlassKlass @ 0x00000000fae00000 (object size = 208)
     - _mark:     {0} :1
     - _metadata._compressed_klass:     {8} :KlassKlass @ 0x00000000fae00000
     - _java_mirror:     {120} :null
     - _super:     {128} :null
     - _layout_helper:     {24} :0
     - _access_flags:     {156} :0
     - _subklass:     {136} :null
     - _next_sibling:     {144} :null
     - _alloc_count:     {160} :0
  • 相关阅读:
    Atitit attilax要工作研究的要素 纪要 方案 趋势 方向 概念 理论
    Atitit 常见每日流程日程日常工作.docx v7 r8f
    Atitit it 互联网 软件牛人的博客列表
    Atitit 信息链(Information Chain)的概念理解 attilax总结
    Atitit 知识点的体系化 框架与方法 如何了解 看待xxx
    Atitit 聚合搜索多个微博 attilax总结
    Atitit 企业知识管理PKM与PIM
    Atitit 项目沟通管理 Atitit 沟通之道 attilax著.docx
    Atitit 项目管理软件 在线服务 attilax总结 1. 项目管理协作的历史 1 1.1. Worktile 406k 1 1.2. Teambition  584k in baidu
    Atitit.每周末总结 于每周一计划日程表 流程表 v8 import 上周遗漏日志补充 检查话费 检查流量情况 Crm问候 Crm表total and 问候
  • 原文地址:https://www.cnblogs.com/aquariusm/p/7392712.html
Copyright © 2020-2023  润新知