Java 基本数据类型 sizeof 功能

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

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

源码:

注意: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个字节根本没有被使用.呵呵,仔细分析了一晚,还是有很多收获的

Original: https://www.cnblogs.com/wdpp/archive/2012/03/01/2386680.html
Author: 程序员天下
Title: Java 基本数据类型 sizeof 功能

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/537521/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 20天等待,申请终于通过,安装和体验IntelliJ IDEA新UI预览版

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于IDEA的预览版 IDEA会启…

    Java 2023年6月8日
    097
  • Docker内运行的nginx除了80端口其他端口都无法访问

    请检查nginx容器是否只开启了80端口映射!!! 请检查nginx容器是否只开启了80端口映射!!! 请检查nginx容器是否只开启了80端口映射!!! 环境: Docker: …

    Java 2023年6月5日
    082
  • arthas 使用指导

    arthas 阿尔萨斯 这种命令行的东西首先得知道 如何使用帮助,帮助文档最先开始用的,应该是可以在网上找到的官方文档 文档一:https://alibaba.github.io/…

    Java 2023年6月5日
    074
  • Java中关键的知识点

    JVM,运行是内存模型 Java 反射 Java 注解 函数式接口 lambda表达式/流式计算 动态代理 欢迎大家阅读,有问题和不足的地方欢迎大家指出。作者:永和九年,转载请注明…

    Java 2023年6月7日
    081
  • RabbitMQ基础知识

    RabbitMQ基础知识 一、RabbitMQ概述 RabbitMQ是一款使用Erlang语言开发的,实现AMQP(高级消息队列协议)的开源消息中间件,它具有以下特性 开源、性能优…

    Java 2023年6月8日
    090
  • javax.net.ssl.SSLException: Certificate doesn’t match any of the subject alternative names

    问题:在使用 org.apache.http.*下的 CloseableHttpClient 发送https请求时报了以上错误 解决方案一:使用java.net.HttpURLCo…

    Java 2023年5月29日
    0101
  • JNPF3.4.2系统升级公告

    尊敬的引迈客户: 您好!为了给您提供更优质的服务,引迈信息将对JNPF快速开发平台进行优化,并于近期同步上线,新版本、新升级,全新体验,敬请期待! 本次优化涉及【在线开发】、【流程…

    Java 2023年6月5日
    077
  • Elasticsearch必知必会的干货知识二:ES索引操作技巧

    一次性创建包含完整的别名(alias)、字段(mappings)、设置(settings)的索引,如: PUT /index_name { "index_name&quo…

    Java 2023年6月9日
    0184
  • 六、面向对象编程

    一、什么是类?什么是对象? 类:具有共同特征的描述 对象:真实存在的具体事例 二、对象的内存图: 两个变量指向同一个对象内存图 三、构造器 就是无参构造方法和有参构造方法 四、th…

    Java 2023年6月6日
    084
  • SpringMVC入手项目注解版

    SpringMVC入手项目注解版 1.创建Maven项目在pom.xml文件引入相关的依赖 <dependencies> <dependency> <…

    Java 2023年6月15日
    084
  • 第2章 Java基本程序设计结构

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    096
  • 【Android】线程池原理及Java简单实现

    线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。 假设一个服务器完成一项任务所需时间为: T1 创建线程…

    Java 2023年5月29日
    066
  • SpringBoot 动态代理实现三方接口调用

    一、定义注解 二、建立动态代理类 三、注入spring容器 四、编写拦截器 五、创建客户端调用类 六、main方法测试 七、启动项目 在某些业务场景中,我们只需要业务代码中定义相应…

    Java 2023年6月16日
    090
  • 简单计算器

    .box{ margin: 0 auto; width: 300px; .text{ margin: 5px; .text input{ width: 100%; height: …

    Java 2023年6月7日
    059
  • 借助redis实现对IP限流

    IpLimterHandler.java 注解AOP处理。 1 import com.missionex.common.annotation.IpLimiter; 2 import…

    Java 2023年6月14日
    087
  • [学习笔记] Java字符和字符串

    在Java中,字符和字符串是两种不同的数据类型; 字符 (char) 是一种基本数据类型,用单引号’ 括起来; 一个char类型可以保存一个标准的ASCII字符或一个U…

    Java 2023年6月5日
    074
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球