Java 基本数据类型 sizeof 功能【转】
转自:http://blog.csdn.net/sunboy_2050/article/details/7310008
版权声明:本文为博主原创文章,未经博主允许不得转载。
Java基本数据类型
int 32bit
short 16bit
long 64bit
byte 8bit
int 32bit
short 16bit
long 64bit
byte 8bit
char 16bit
float 32bit
double 64bit
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.
使用这些简单的内存访问,可以得到内存的一些情况,我们通过建立一个大的某个类的数组,来查看内存用了多少,进而可以求得类的大小。
源码:
注意: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个字节根本没有被使用.呵呵,仔细分析了一晚,还是有很多收获的
参考推荐:
Primitive Data Types (SUN 官方文档)
|
【作者】sky
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
2015-09-18 Linux内核驱动之GPIO子系统(一)GPIO的使用【转】
2015-09-18 Linux内核驱动基础(一)常用宏定义【转】
2015-09-18 Linux设备驱动之Ioctl控制【转】