zoukankan      html  css  js  c++  java
  • 搞定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
  • 相关阅读:
    如何把本地项目上传到Github
    Git使用详细教程
    PhpStorm中报 “Cannot run program git.exe, 系统找不到指定的文件” 
    delete
    CentOS7 vs centos6
    CentOS 七 vs CentOS 6的不同
    内网端口转发方法汇总
    推荐给开发人员的6个实用命令行工具
    从大公司离职去小公司当 CTO 是一种怎样的体验?
    如果要做点对点的视频传输应该一般使用什么协议
  • 原文地址:https://www.cnblogs.com/aquariusm/p/7392712.html
Copyright © 2011-2022 走看看