当前位置:  编程技术>移动开发
本页文章导读:
    ▪【转】JVM阅览:HotSpot source: classloading        【转】JVM阅读:HotSpot source: classloading HotSpot source: classloading In the past, I wrote about Java class loading in these entries: Understanding Java class loading Understanding Java class loading - part 2 Now, if you have downloaded JD.........
    ▪ Andorid-TableLayout(报表布局)        Andorid--TableLayout(表格布局) TableLayout是一个以行、列显示视图View的视图组1、开始一个新的工程,名字叫做HelloTableLayout2、打开res/layout/main.xml文件并且插入如下内容Java代码<?xml version="1.0" e.........
    ▪ sizeof union struct 内存储器对齐       sizeof union struct 内存对齐 sizeof union struct 内存对齐(2010-07-30 23:24:33)转载标签:it union u{ double a; int b;};union u2{ char a[13]; int b;};union u3{ char a[13]; char b;};cout<<sizeof(u)<<endl; // 8cout.........

[1]【转】JVM阅览:HotSpot source: classloading
    来源: 互联网  发布时间: 2014-02-18
【转】JVM阅读:HotSpot source: classloading

HotSpot source: classloading 

In the past, I wrote about Java class loading in these entries:

  • Understanding Java class loading
  • Understanding Java class loading - part 2
Now, if you have downloaded JDK source from http://jdk6.dev.java.net and you want to understand classloading in HotSpot JVM, you may want to look at these files:
  • $JDK/src/share/vm/runtime/classFileParser.hpp (and .cpp)
  • $JDK/src/share/vm/runtime/classFileStream.hpp (and .cpp)
  • $JDK/src/share/vm/memory/classLoader.hpp (and .cpp)
  • $JDK/src/share/vm/memory/systemDictionary.hpp (and .cpp)
  • $JDK/src/share/vm/memory/loaderConstraints.hpp (and .cpp)
  • $JDK/src/share/vm/oops/InstanceKlass.hpp (and .cpp) - in particular bool instanceKlass::link_class_impl method
You may want to refer to Dynamic Class Loading in the Java Virtual Machine as well. A good to way to learn classloading is to trace JVM using DTrace on Solaris OS. There is a hotspot::class-loaded probe. For example, on class-loaded probes, you may call jstack action to print stack trace whenever a java class is loaded (or unloaded). If you are reading (and planning to hack!) HotSpot sources, you may want to try these as well:
  • HotSpot is a C++ program. You can try what is described in "Using DTrace to Profile and Debug A C++ Program"
  • Insert your own USDT probes in HotSpot source and recompile! [refer: User-land tracing gets better and better]
  • Note that aforementioned DTrace tricks can be used to trace any subsystem of HotSpot - not neccesarily classloading!

     

    A. Sundararajan's Weblog 

    A. Sundararajan's Weblog -- sundararajan


        
    [2] Andorid-TableLayout(报表布局)
        来源: 互联网  发布时间: 2014-02-18
    Andorid--TableLayout(表格布局)
    TableLayout是一个以行、列显示视图View的视图组

    1、开始一个新的工程,名字叫做HelloTableLayout

    2、打开res/layout/main.xml文件并且插入如下内容
    Java代码
    <?xml version="1.0" encoding="utf-8"?>
    <TableLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:stretchColumns="1">
            <TableRow>
                    <TextView
                            android:layout_column="1"
                            android:text="Open..."
                            android:padding="3dip"
                    />
                    <TextView
                            android:text="Ctrl-O"
                            android:gravity="right"
                            android:padding="3dip"
                    />
            </TableRow>
            <TableRow>
                    <TextView
                            android:layout_column="1"
                            android:text="Save..."
                            android:padding="3dip"
                    />
                    <TextView
                            android:text="Ctrl-S"
                            android:gravity="right"
                            android:padding="3dip"
                    />
            </TableRow>
            <TableRow>
                    <TextView
                            android:layout_column="1"
                            android:text="Save as..."
                            android:padding="3dip"
                    />
                    <TextView
                            android:text="Ctrl-Shift-S"
                            android:gravity="right"
                            android:padding="3dip"
                    />
            </TableRow>
            <View
                    android:layout_height="2dip"
                    android:background="#FF909090"
            />
            <TableRow>
                    <TextView
                            android:text="X"
                            android:padding="3dip"
                    />
                    <TextView
                            android:text="Import..."
                            android:padding="3dip"
                    />
            </TableRow>
            <TableRow>
                    <TextView
                            android:text="X"
                            android:padding="3dip"
                    />
                    <TextView
                            android:text="Export..."
                            android:padding="3dip"
                    />
                    <TextView
                            android:text="Ctrl-E"
                            android:gravity="right"
                            android:padding="3dip"
                    />
            </TableRow>
            <View
                    android:layout_height="2dip"
                    android:background="#FF909090"
            />
            <TableRow>
                    <TextView
                            android:layout_column="1"
                            android:text="Quit"
                            android:padding="3dip"
                    />
            </TableRow>
    </TableLayout>


    注意到这个文件类似于HTML的table的结构,TableLayout元素就像是HTML中的<table>元素;TableRow就像是一一个<tr>元素;但是对于每一个单元格,你可以用各种视图元素,在这里例子里,每个单元格用TextView,在这些行之间,还有一个基本View,用来画水平线
    TextView中的一些属性
    android:layout_column="1":表示控件放在标号为1的列上,标号是从0开始的
    android:gravity="right":定义字体在父控件中显示在右边
    android:stretchColumns="1":设置自动拉伸哪些列,列ID从0开始,多个列的话用","分隔。这里的作用是让第2列可以扩展到所有可用空间
    android:shrinkColumns:设置自动收缩哪些列,列ID从0开始,多个列的话用","分隔
    android:collapseColumns:设置自动隐藏哪些列,列ID从0开始,多个列的话用","分隔
    顺便:android:layout_span表示一个控件占几列空间
    下面的是基本的View,是在屏幕上画一条2dip高的一条横线
    <View
      android:layout_height="2dip"
      android:background="#FF909090"
    />

    3、运行结果如下:



        
    [3] sizeof union struct 内存储器对齐
        来源: 互联网  发布时间: 2014-02-18
    sizeof union struct 内存对齐
    sizeof union struct 内存对齐
    (2010-07-30 23:24:33)
    转载
    标签:
    it


    union u
    {
     double a;
     int b;
    };

    union u2
    {
     char a[13];
     int b;
    };

    union u3
    {
     char a[13];
     char b;
    };

    cout<<sizeof(u)<<endl; // 8
    cout<<sizeof(u2)<<endl; // 16
    cout<<sizeof(u3)<<endl; // 13



     都知道union的大小取决于它所有的成员中,占用空间最大的一个成员的大小。所以对于u来说,大小就是最大的double类型成员a了,所以sizeof(u)=sizeof(double)=8。但是对于u2和u3,最大的空间都是char[13]类型的数组,为什么u3的大小是13,而u2是16呢?关键在于u2中的成员int b。由于int类型成员的存在,使u2的对齐方式变成4,也就是说,u2的大小必须在4的对界上,所以占用的空间变成了16(最接近13的对界)。

      结论:复合数据类型,如union,struct,class的对齐方式为成员中对齐方式最大的成员的对齐方式。

      顺便提一下CPU对界问题,32的C++采用8位对界来提高运行速度,所以编译器会尽量把数据放在它的对界上以提高内存命中率。对界是可以更改的,使用#pragma pack(x)宏可以改变编译器的对界方式,默认是8。C++固有类型的对界取编译器对界方式与自身大小中较小的一个。例如,指定编译器按2对界,int类型的大小是4,则int的对界为2和4中较小的2。在默认的对界方式下,因为几乎所有的数据类型都不大于默认的对界方式8(除了long double),所以所有的固有类型的对界方式可以认为就是类型自身的大小。更改一下上面的程序:

    #pragma pack(2)
    union u2
    {
     char a[13];
     int b;
    };

    union u3
    {
     char a[13];
     char b;
    };
    #pragma pack(8)

    cout<<sizeof(u2)<<endl; // 14
    cout<<sizeof(u3)<<endl; // 13



      由于手动更改对界方式为2,所以int的对界也变成了2,u2的对界取成员中最大的对界,也是2了,所以此时sizeof(u2)=14。

      结论:C++固有类型的对界取编译器对界方式与自身大小中较小的一个。

      9、struct的sizeof问题

      因为对齐问题使结构体的sizeof变得比较复杂,看下面的例子:(默认对齐方式下)

    struct s1
    {
     char a;
     double b;
     int c;
     char d;
    };

    struct s2
    {
     char a;
     char b;
     int c;
     double d;
    };

    cout<<sizeof(s1)<<endl; // 24
    cout<<sizeof(s2)<<endl; // 16





    同样是两个char类型,一个int类型,一个double类型,但是因为对界问题,导致他们的大小不同。计算结构体大小可以采用元素摆放法,我举例子说明一下:首先,CPU判断结构体的对界,根据上一节的结论,s1和s2的对界都取最大的元素类型,也就是double类型的对界8。然后开始摆放每个元素。

      对于s1,首先把a放到8的对界,假定是0,此时下一个空闲的地址是1,但是下一个元素d是double类型,要放到8的对界上,离1最接近的地址是8了,所以d被放在了8,此时下一个空闲地址变成了16,下一个元素c的对界是4,16可以满足,所以c放在了16,此时下一个空闲地址变成了20,下一个元素d需要对界1,也正好落在对界上,所以d放在了20,结构体在地址21处结束。由于s1的大小需要是8的倍数,所以21-23的空间被保留,s1的大小变成了24。

      对于s2,首先把a放到8的对界,假定是0,此时下一个空闲地址是1,下一个元素的对界也是1,所以b摆放在1,下一个空闲地址变成了2;下一个元素c的对界是4,所以取离2最近的地址4摆放c,下一个空闲地址变成了8,下一个元素d的对界是8,所以d摆放在8,所有元素摆放完毕,结构体在15处结束,占用总空间为16,正好是8的倍数。

      这里有个陷阱,对于结构体中的结构体成员,不要认为它的对齐方式就是他的大小,看下面的例子:



    struct s1
    {
     char a[8];
    };

    struct s2
    {
     double d;
    };

    struct s3
    {
     s1 s;
     char a;
    };

    struct s4
    {
     s2 s;
     char a;
    };

    cout<<sizeof(s1)<<endl; // 8
    cout<<sizeof(s2)<<endl; // 8
    cout<<sizeof(s3)<<endl; // 9
    cout<<sizeof(s4)<<endl; // 16;





      s1和s2大小虽然都是8,但是s1的对齐方式是1,s2是8(double),所以在s3和s4中才有这样的差异。

      所以,在自己定义结构体的时候,如果空间紧张的话,最好考虑对齐因素来排列结构体里的元素。



    struct {
        int n;
        char s[10];
        union {
            int a[5];
            char b;
            double c;    
        } u_a;        
    } b;





    结论:struct 里面的元素是顺序存储的,每个元素占用的字节数根据对齐字节数N(struct 里占用字节最多的元素与CPU对齐字节数中较小的一个)进行调整.如果从左至右M个元素加起来的字节数大于N,则按从右至左舍去K个元素直至M-K个元素加起来的字节数小于等于N,如果等于N则不用字节填充,小于N则把M-K-1的元素填充直至=N.

        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3