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

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` 在Java中并不存在,与C++等语言不同,Java没有提供直接计算对象或变量在内存中占用字节数的内置方法。然而...

    java基本数据类型习题(选择24).pdf

    Java基本数据类型习题解析 Java是一种 objeto-orientada 编程语言,基本数据类型是Java语言的基础,它们是构建其他数据类型的基本单元。在Java中,有八种基本数据类型:byte、short、int、long、float、double、...

    java基本数据类型习题(选择24) (2).pdf

    在这个Java基本数据类型习题中,我们可以深入理解Java的数据类型及其规则。 1. 标识符的合法性:在Java中,合法的标识符不能以数字开头,不能包含特殊字符(如+、-),但可以使用下划线(_)和美元符号($)。所以...

    java基本数据类型习题选择24.pdf

    在Java编程语言中,基本数据类型是编程的基础,它们包括整数型、浮点型、字符型和布尔型。下面将详细阐述这些知识点。 1. 标识符:标识符是用来命名变量、类、方法等的名称。合法的标识符必须以字母、下划线(_)或...

    java基本数据类型习题选择24.docx

    Java是一种广泛使用的面向对象的编程语言,它的基本数据类型是编程的基础。以下是根据题目内容解析的相关知识点: 1. **标识符**:在Java中,合法的标识符由字母、数字和下划线组成,且不能以数字开头。选项中,...

    java基本数据类型习题(选择24).doc

    Java是一种广泛使用的面向对象的编程语言,其基本数据类型是编程的基础。以下是对题目中涉及的知识点的详细解释: 1. **标识符**:在Java中,标识符用于命名变量、类、方法等。合法的标识符必须以字母、美元符号($)...

    java基本数据类型习题(选择24)..doc

    这里我们探讨一下Java的基本数据类型及其相关习题。 1. 合法标识符:在Java中,标识符用于命名变量、类、接口等,必须以字母、美元符号($)或下划线(_)开头,后续可以跟字母、数字或下划线。因此,合法的标识符是D、...

    java基本数据类型习题(选择24) (2).docx

    这些知识点主要涉及Java的基本数据类型、变量、标识符以及它们的相关概念。 ### Java基本数据类型与标识符 1. **合法标识符**: - 选项D (`_black`) 是合法的标识符。在Java中,标识符可以由字母、数字、下划线...

    java基本数据类型习题(选择24)..docx

    3. 数据类型:Java的基本数据类型包括整数型、字符型、浮点型以及布尔型。选项D '数组' 属于复合数据类型,而不是基本类型。 4. 变量组成部分:变量由变量名、变量类型和变量值组成。选项B '变量属性' 通常指的是...

    java基本数据类型习题(选择24)..pdf

    20. **复合数据类型**:接口是Java的复合数据类型,A、B是基本数据类型,C是C/C++的概念,在Java中不存在。 21. **整型常量**:034代表八进制数34,B正确;34L代表34的长整型,D正确。 22. **整型类型**:Java的...

    java 通过sizeOf计算一个对象的大小

    例如,对于基本类型,我们可以知道它们在内存中的固定大小;对于引用类型,我们需要递归地计算它们所引用的对象的大小。这种方法的一个局限性是它不考虑对象头、对齐填充等因素,这些在实际内存分配中都可能影响对象...

    面向对象编程:Java的简单数据类型

    Java没有提供`sizeof`运算符,因为其简单数据类型不是直接内存访问的对象,而是有明确的内存占用定义。这也意味着开发者无法直接获取变量在内存中的大小。 为了使简单数据类型具备面向对象特性,Java提供了对应的...

    Java标识符、关键字和数据类型

    值得注意的是,Java不支持C语言中的"sizeof"运算符,因为所有数据类型的大小是固定的。此外,"goto"和"const"在Java中不是关键字,这是与C++的一个显著差异。 **基本数据类型**是Java中的核心数据结构,分为四类:...

    java程序员笔试题java程序员笔试题

    知识点:Java 数据类型、变量赋值、基本数据类型。 5. 将一个十六进制值赋给一个 long 型变量正确的写法是使用 0x 前缀。 知识点:Java 数据类型、变量赋值、十六进制数。 6. 该道题考察了 Java 中的位运算符和...

    java和c/c++ 数据类型长度的比较

    需要注意的是,`sizeof()`运算符可以用来获取数据类型占用的字节数,但这可能会受到编译器和平台的影响。 C++在数据类型长度方面与C基本一致,但有一些额外的特性。例如,C++中的char类型始终是8位,保证了一致性。...

    Java详细总结(精辟版++)

    Java 中没有 unsigned,也就是说 Java 中的基本数据类型都是有符号的。 Java 关键字和运算符 Java 中有多种关键字,包括数据类型、流程控制、修饰符、动作和保留字等。Java 运算符和 C/C++ 的运算符类似,功能也...

Global site tag (gtag.js) - Google Analytics