`
zljpp
  • 浏览: 255347 次
社区版块
存档分类
最新评论

Java 基本数据类型 sizeof 功能

    博客分类:
  • java
阅读更多

Java基本数据类型
int     32bit

short   16bit
long    64bit
byte    8bit
char    16bit
float   32bit
double  64bit
boolean 1bit,This data type represents one bit of information, but its "size" isn't something that's precisely defined.(ref

Java基本数据类型大小
   private static void calSize() {  
        System.out.println("Integer: " + Integer.SIZE/8);           // 4  
        System.out.println("Short: " + Short.SIZE/8);               // 2      
        System.out.println("Long: " + Long.SIZE/8);                 // 8  
        System.out.println("Byte: " + Byte.SIZE/8);                 // 1  
        System.out.println("Character: " + Character.SIZE/8);       // 2  
        System.out.println("Float: " + Float.SIZE/8);               // 4  
        System.out.println("Double: " + Double.SIZE/8);             // 8  
//      System.out.println("Boolean: " + Boolean);  
    }  
 Java中模拟c中对sizeof的实现
思路:利用java中GC内存回收前后的heap size差别,得出每个object的大小

 


这是一个程序,java中没有现成的sizeof的实现,原因主要是java中的基本数据类型的大小都是固定的,所以看上去没有必要用sizeof这个关键字。
实现的想法是这样的:java.lang.Runtime类中有一些简单的能涉及到内存管理的函数:
Every Java application has a single instance of class Runtime that allows the application to interface with the environment in which the application is running. The current runtime can be obtained from the getRuntime method.
 long
freeMemory()
Returns the amount of free memory in the Java Virtual Machine.
 void
gc()
Runs the garbage collector.
static Runtime
getRuntime()
Returns the runtime object associated with the current Java application.
 long
maxMemory()
Returns the maximum amount of memory that the Java virtual machine will attempt to use.
 void
runFinalization()
Runs the finalization methods of any objects pending finalization.
使用这些简单的内存访问,可以得到内存的一些情况,我们通过建立一个大的某个类的数组,来查看内存用了多少,进而可以求得类的大小。

源码:
  private static void calSize2() {  
        runGC();  
  
        long heap1 = 0;  
        final int count = 100000;  
        Object[] objs = new Object[count];  
  
        for(int i=-1; i<count; i++) {  
            Object obj = null;  
            obj = new Object();                 // 8  
//          obj = new Integer( i );             // 16  
//          obj = new Short( (short)i );        // 16  
//          obj = new Long( i );                // 16  
//          obj = new Byte( (byte)0 );          // 16  
//          obj = new Character( (char)i );     // 16  
//          obj = new Float( i );               // 16  
//          obj = new Double( i );              // 16  
//          obj = new Boolean( true );          // 16  
//          obj = new String();                 // 40  
              
              
            if(i<0){  
                obj = null;  
                runGC();  
                heap1 = usedMemory();   // before memory size  
            } else {  
                objs[i] = obj;   
            }  
        }  
  
        runGC();  
        long heap2 = usedMemory();      // after memory size  
          
        final int size = (int)Math.round( (heap2 - heap1)/(double)count );  
        System.out.println("heap1 = " + heap1 + "; heap2 = " + heap2);  
        System.out.println("heap2-heap1 = " + (heap2 - heap1) + "; " + objs[0].getClass().getSimpleName() + " size = " + size);  
          
        for(int i=0; i<count; i++) {  
            objs[i] = null;  
        }  
        objs = null;  
        runGC();  
    }  
      
    private static void runGC() {  
        for(int i=0; i<4; i++) {  
            long usedMem1 = usedMemory();  
            long usedMem2 = Long.MAX_VALUE;  
              
            for(int j=0; (usedMem1<usedMem2) && (j<500); j++) {  
                rTime.runFinalization();  
                rTime.gc();  
                Thread.yield();  
                  
                usedMem2 = usedMem1;  
                usedMem1 = usedMemory();  
            }  
        }  
    }  
      
    private static long usedMemory() {  
        return rTime.totalMemory() - rTime.freeMemory();  
    }  
 注意:Object[] objects = new Object[count];
只是分配了数组空间,没有分配对象的空间。数组中只有引用而已。
 
结论:下代码测试基本对象时,得出的结果象下面:   
Object obj = null;
obj = new Object(); // 8
obj = new Integer( i ); // 16
obj = new Short( (short)i ); // 16
obj = new Long( i ); // 16
obj = new Byte( (byte)0 ); // 16
obj = new Character( (char)i ); // 16
obj = new Float( i ); // 16
obj = new Double( i ); // 16
obj = new Boolean( true ); // 16
obj = new String(); // 40

怎么会这样呢???解释如下:
 
这个例子写的很好,正好说明了java中基本类型封装对象所占内存的大小.   
1.简单的Object对象要占用8个字节的内存空间,因为每个实例都至少必须包含一些最基本操作,比如:wait()/notify(),equals(),   hashCode()等   
2.使用Integer对象占用了16个字节,而int占用4个字节,说了封装了之后内存消耗大了4倍   

3.那么Long看起来比Integer对象应该使用更多空间,结果Long所占的空间也是16个字节.   
那么就正好说明了JVM的对于基本类型封装对象的内存分配的规则是如下:   
Object所占内存(8个字节)+最大基本类型(long)所占内存(8个字节)   =   16字节.   
JVM强制使用8个字节作为边界.   
所以所有基本类型封装对象所占内存的大小都是16字节.
但是还是有区别,比如:
Integer对象虽然占用了16个字节的内存,但是只是利用了 Object所占内存(8个字节)+int所占内存(4个字节)   =   12字节.
3
0
分享到:
评论

相关推荐

    Java之基本数据类型 Sizeof 大小

    Java之基本数据类型 Sizeof 大小

    Thinking in java4(中文高清版)-java的'圣经'

    一切都是对象 2.1 用引用操纵对象 2.2 必须由你创建所有对象 2.2.1 存储到什么地方 2.2.2 特例:基本类型 2.2.3 Java中的数组 2.3 永远不需要销毁对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 创建新的数据类型:类 ...

    java基础课件ppt

    java基础课件ppt与上机练习题....所有的数据类型所占用的字节数都是固定的,并且和实现无关,因此在Java中没有sizeof操作符。 不必死记这些关键词,当理解每个关键词的含义后,自然就记住了所有的关键词。

    java 编程入门思考

    2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 ...

    Java初学者入门教学

    2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 ...

    java联想(中文)

    2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 ...

    JAVA_Thinking in Java

    2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 ...

    Thinking in Java简体中文(全)

    2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 ...

    Thinking in Java 中文第四版+习题答案

    2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 ...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 ...

    Thinking in java(中文)

    主类型 2.2.3 Java中的数组 2.3 绝对不要清除对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java...

    Think in Java(中文版)chm格式

    2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和...

    Android Kotlin开发实例(Hello World!)及语法详解

    Kotlin是一种在 Java虚拟机上执行的静态型别编程语言,它主要是由俄罗斯圣彼得堡的JetBrains开发团队所发展出来的编程语言。该语言有几个优势 1. 简洁 它大大减少你需要写的样板代码的数量。 2. 安全 避免空...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 ...

    编程思想下篇

    2.4 创建新的数据类型:类 2.4.1 域和方法 2.4.2 基本成员默认值 2.5 方法、参数和返回值 2.5.1 参数列表 2.6 构建一个Java程序 2.6.1 名字可见性 2.6.2 运用其他构件 2.6.3 static 关键字 2.7 你的第一个Java程序 ...

    thinkinjava.chm

    2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 ...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    第3章 基本数据类型 3.1 声明、表达式和赋值 3.2 基本数据类型 3.3 字符和char数据类型 3.4 int数据类型 3.5 整数类型short、long和unsigned 3.6 浮点类型 3.7 typedef的用法 3.8 sizeof操作符 3.9 使用getchar()...

    ThinkInJava

    2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 ...

    thinkinjava

    2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 ...

    Visual C++ 2005入门经典--源代码及课后练习答案

    2.9.1 C++/CLI特有的基本数据类型 87 2.9.2 命令行上的C++/CLI输出 91 2.9.3 C++/CLI特有的功能——格式化输出 92 2.9.4 C++/CLI的键盘输入 94 2.9.5 使用safe_cast 95 2.9.6 C++/CLI枚举 96 2.10 小...

Global site tag (gtag.js) - Google Analytics