Java 基本数据类型 sizeof 功能【转】

 

转自:http://blog.csdn.net/sunboy_2050/article/details/7310008

版权声明:本文为博主原创文章,未经博主允许不得转载。

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基本数据类型大小

[java] view plain copy

 

 print?

  1.     private static void calSize() {  
  2.         System.out.println("Integer: " + Integer.SIZE/8);           // 4  
  3.         System.out.println("Short: " + Short.SIZE/8);               // 2      
  4.         System.out.println("Long: " + Long.SIZE/8);                 // 8  
  5.         System.out.println("Byte: " + Byte.SIZE/8);                 // 1  
  6.         System.out.println("Character: " + Character.SIZE/8);       // 2  
  7.         System.out.println("Float: " + Float.SIZE/8);               // 4  
  8.         System.out.println("Double: " + Double.SIZE/8);             // 8  
  9. //      System.out.println("Boolean: " + Boolean);  
  10.     }  

 

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.

使用这些简单的内存访问,可以得到内存的一些情况,我们通过建立一个大的某个类的数组,来查看内存用了多少,进而可以求得类的大小。

 

源码:

 

[java] view plain copy

 

 print?

  1.     private static void calSize2() {  
  2.         runGC();  
  3.   
  4.         long heap1 = 0;  
  5.         final int count = 100000;  
  6.         Object[] objs = new Object[count];  
  7.   
  8.         for(int i=-1; i<count; i++) {  
  9.             Object obj = null;  
  10.             obj = new Object();                 // 8  
  11. //          obj = new Integer( i );             // 16  
  12. //          obj = new Short( (short)i );        // 16  
  13. //          obj = new Long( i );                // 16  
  14. //          obj = new Byte( (byte)0 );          // 16  
  15. //          obj = new Character( (char)i );     // 16  
  16. //          obj = new Float( i );               // 16  
  17. //          obj = new Double( i );              // 16  
  18. //          obj = new Boolean( true );          // 16  
  19. //          obj = new String();                 // 40  
  20.               
  21.               
  22.             if(i<0){  
  23.                 obj = null;  
  24.                 runGC();  
  25.                 heap1 = usedMemory();   // before memory size  
  26.             } else {  
  27.                 objs[i] = obj;   
  28.             }  
  29.         }  
  30.   
  31.         runGC();  
  32.         long heap2 = usedMemory();      // after memory size  
  33.           
  34.         final int size = (int)Math.round( (heap2 - heap1)/(double)count );  
  35.         System.out.println("heap1 = " + heap1 + "; heap2 = " + heap2);  
  36.         System.out.println("heap2-heap1 = " + (heap2 - heap1) + "; " + objs[0].getClass().getSimpleName() + " size = " + size);  
  37.           
  38.         for(int i=0; i<count; i++) {  
  39.             objs[i] = null;  
  40.         }  
  41.         objs = null;  
  42.         runGC();  
  43.     }  
  44.       
  45.     private static void runGC() {  
  46.         for(int i=0; i<4; i++) {  
  47.             long usedMem1 = usedMemory();  
  48.             long usedMem2 = Long.MAX_VALUE;  
  49.               
  50.             for(int j=0; (usedMem1<usedMem2) && (j<500); j++) {  
  51.                 rTime.runFinalization();  
  52.                 rTime.gc();  
  53.                 Thread.yield();  
  54.                   
  55.                 usedMem2 = usedMem1;  
  56.                 usedMem1 = usedMemory();  
  57.             }  
  58.         }  
  59.     }  
  60.       
  61.     private static long usedMemory() {  
  62.         return rTime.totalMemory() - rTime.freeMemory();  
  63.     }  

 

 

注意: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字节.

还有4个字节根本没有被使用.呵呵,仔细分析了一晚,还是有很多收获的

 

 

测试源码下载

 

 

参考推荐:

关于java中boolean占用字节的问题

java中的 boolean 在内存中占多少字节?

Primitive Data Types (SUN 官方文档)

时间: 2024-10-28 05:14:28

Java 基本数据类型 sizeof 功能【转】的相关文章

java 后台实现打印功能

问题描述 java 后台实现打印功能 请问,java 后台怎么实现打印功能?求解 有现成代码的帖出来看看 谢谢了 解决方案 System.out.println就行了,, 解决方案二: 用JAVA实现打印功能用java实现打印功能用java实现打印功能 解决方案三: http://www.ibm.com/developerworks/cn/java/l-javaprint/ 解决方案四: 你说的打印功能是什么意思呢?调用打印机打印,还是就是Eclipse你的控制台打印日志信息呢?后者的话直接我们

JS自定义对象实现Java中Map对象功能的方法

这篇文章主要介绍了JS自定义对象实现Java中Map对象功能的方法,可实现类似Java中Map对象增删改查等功能,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了JS自定义对象实现Java中Map对象功能的方法.分享给大家供大家参考.具体分析如下: Java中有集合,Map等对象存储工具类,这些对象使用简易,但是在JavaScript中,你只能使用Array对象. 这里我创建一个自定义对象,这个对象内包含一个数组来存储数据,数据对象是一个Key,可以实际存储的内容! 这里Key

浅析Java基本数据类型

作为一种强类型语言,Java针对每一种数据都定义了明确的数据类型.大体来讲可分为:基本数据类型和引用数据类型:在此,主要讨论前者,后者以后再继续探究. Java基本数据类型分为四类八种: 1: 整数 占用字节数 byte 1 short 2 int 4 long 8 2:浮点数 float 4 double 8 3:字符 char 2 4:布尔 boolean 1 请注意: 整数默认为int类型 浮点数默认为double类型 在声明double类型的数据时,建议添加后缀L 在声明float类型的

Flex结合java实现一个登录功能

转自http://www.cnblogs.com/kunpengit/archive/2011/12/06/2277657.html Flex结合java实现一个登录功能 1.  环境的搭建: s 对message-congig.xml配置如下: <?xml version="1.0" encoding="UTF-8"?> <service id="remoting-service"     class="flex.m

Java实现验证码验证功能

Java如何实现验证码验证功能呢?日常生活中,验证码随处可见,他可以在一定程度上保护账号安全,那么他是怎么实现的呢? Java实现验证码验证功能其实非常简单:用到了一个Graphics类在画板上绘制字母,随机选取一定数量的字母随机生成,然后在画板上随机生成几条干扰线. 首先,写一个验证码生成帮助类,用来绘制随机字母: import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.ima

JS自定义对象实现Java中Map对象功能的方法_javascript技巧

本文实例讲述了JS自定义对象实现Java中Map对象功能的方法.分享给大家供大家参考.具体分析如下: Java中有集合,Map等对象存储工具类,这些对象使用简易,但是在JavaScript中,你只能使用Array对象. 这里我创建一个自定义对象,这个对象内包含一个数组来存储数据,数据对象是一个Key,可以实际存储的内容!   这里Key,你要使用String类型,和Java一样,你可以进行一些增加,删除,修改,获得的操作. 使用很简单,我先把工具类给大家看下: 复制代码 代码如下: /**  *

activex-linux环境 java 开发类似Activex功能的插件或控件

问题描述 linux环境 java 开发类似Activex功能的插件或控件 linux环境 java 开发类似Activex功能的插件或控件,能够访问本地的程序

Java基本数据类型

Java基本数据类型总结 种类共有8种 byte 1Byte = 8bit -128 ~127 short 2Byte = 16bit -32768 ~ 32767 int 4Byte = 32bit -2147483648~+2147483647 long 8Byte = 64bit 2的63次方 ~ 2的63次方-1 Float(单精度) 4Byte = 32bit   Double(双精度) 8Byte = 64bit   布尔类型boolean  在jvm中为int,或short tru

java代码-java引用数据类型的问题,请大神解释下标注的问题.....

问题描述 java引用数据类型的问题,请大神解释下标注的问题..... import java.util.Scanner; public class Bank implements Runnable { Acount acount; public Bank(Acount a) -->这个构造方法的含义? { this.acount=a; } public void run() { Scanner input=new Scanner(System.in); System.out.println(&qu