这是一个程序,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

void

long

void

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

源码:

private static void calSize2() {

runGC();

long heap1 = 0;

final int count = 100000;

Object[] objs = new Object[count];

for(int i=-1; 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

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

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字节.

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

java 关键字 sizeof_Java 基本数据类型 sizeof 功能相关推荐

  1. Java 基本数据类型 sizeof 功能

    Java基本数据类型 int     32bit short   16bit long    64bit byte    8bit char    16bit float   32bit double ...

  2. java 关键字高亮_关于搜索功能的关键字高亮显示是如何实现的

    jq中的实现方法: //搜索结果高亮显示 function encode(s) { return s.replace(/&/g, "&").replace(//g, ...

  3. Java关键字—基本数据类型

    Java关键字之-基本数据类型 byte.shout.int.long.float.double.boolean.char 关键字 byte.shout.int.long.float.double基本 ...

  4. 疯狂java(三)-数据类型和运算符(疯狂java第4版)

    文章目录 3.1 注释 3.1.1 注释分类 3.1.2 javadoc 3.1.3 包注释 3.2 标识符和关键字 3.2.1 分隔符. 3.2.2 Java标识符规则 3.2.3 Java关键字 ...

  5. java关键字和标识符_Java数据类型和标识符

    java关键字和标识符 在本教程中,我们将了解Java中的数据类型和标识符. Java语言具有丰富的数据类型实现. 数据类型指定大小和可以存储在标识符中的值的类型. Java数据类型分为两类: 原始数 ...

  6. java final char_java基本数据类型总结 类型转换 final关键字的用法

    java基本数据类型总结 Java数据类型总结 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式.接触每种语言的时候,都会存在数据类型的认识,有复杂的. ...

  7. Java关键字及其作用

    一. 关键字总览: 访问控制 private protected public             类,方法和变量修饰符 abstract class extends final implemen ...

  8. 【Java学习笔记之一】java关键字及作用

    Java关键字及其作用 一. 总览: 1 访问控制 2 private protected public 3 4 类,方法和变量修饰符 5 abstract class extends final i ...

  9. java中的基本数据类型_Java中的基本数据类型和引用数据类型

    数据类型用于帮助确定变量可存放的一组值,以及可对这组特定值执行的操作.Java提供了在所有平台上都普遍支持的多种数据类型. 一.基本数据类型 byte:Java中最小的数据类型,在内存中占8位(bit ...

最新文章

  1. 亚马逊马超:如何使用DGL进行大规模图神经网络训练?
  2. Azure上A/D系列虚拟机到DS系列迁移(2)
  3. CS231n官方笔记授权翻译总集篇发布
  4. 潜在语义分析对认知科学的启示
  5. etcher制作mac启动盘_如何快速制作 macOS Mojave U盘启动盘,并重装Mac系统
  6. Linux内核 获取本机mac,Linux获取本机MAC地址
  7. STL学习系列七:优先级队列priority_queue容器
  8. 科普:为什么 String hashCode 方法选择数字31作为乘子
  9. Saltstack-7:返回
  10. 【数码管识别】需要注意的问题
  11. 【渝粤教育】广东开放大学 经济法基础 形成性考核 (52)
  12. 游戏邦社交游戏-手机游戏行业分析报告(2010年版)
  13. 浅谈Sun Solaris启动
  14. 高数 | 函数在间断点处的极值问题
  15. 谷歌、甲骨文史诗级版权诉讼案,10 年 API 之争本周开审
  16. Windows Mobile 6.x 下改Tahoma字体+微软雅黑说明
  17. Android 最简单的自定义证件照Mask之一
  18. 智慧幼儿园方案:AI技术如何助力幼儿园智慧建设?
  19. VSCode调试C/C++项目
  20. 又一个奇葩要求,看看Python是如何将“中文”转“拼音”的?

热门文章

  1. LeetCode 553. 最优除法(数学)
  2. html写学生信息管理,vue实现简单学生信息管理案例
  3. 什么叫诚实_他爱不爱你,身体最诚实
  4. java定时器只执行一次_面试阿里P6,却被MySQL难倒,二战阿里,挤进天猫团队(Java岗)...
  5. 亚马逊出的平板电脑_亚马逊推出了这款不到400元的平板电脑!学生党的福音!...
  6. 深入浅出不可思议的中文分词技术
  7. SpringCloud中文社区转型Spring4All欢迎您的加入
  8. Hadoop YARN:调度性能优化实践
  9. 领域应用 | 推荐算法不够精准?让知识图谱来解决
  10. 百度开源 FAQ 问答系统(AnyQ)安装---Linux(无docker)+小白编译AnyQ-dockerlinux[CentOs]