`
1025250620
  • 浏览: 229909 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java知识点

 
阅读更多

 

原文地址:点击打开链接 ,翻译有出入之处,请以原文为准

本文中,我们讨论一个问题:如何计算(或者说,估算)一个Java对象占用的内存数量?

通常,我们谈论的堆内存使用的前提是以“一般情况”为背景的。不包括下面两种情形:

 

  1. 某些情况下,JVM根本就没有把Object放入堆中。例如:原则上讲,一个小的thread-local对象存在于栈中,而不是在堆中。
  2. 被Object占用内存的大小依赖于Object的当前状态。例如:Object的同步锁是否生效,或者,Object是否正在被回收。
我们先来看看在堆中单个的Object长什么样子

 

 

在堆中,每个对象由四个域构成(A、B、C 和 D),下面我们逐个解释一下:

 

  1. A:对象头,占用很少的字节,表述Object当前状态的信息
  2. B:基本类型域占用的空间(原生域指 int、boolean、short等)
  3. C:引用类型域占用的空间(引用类型域指 其他对象的引用,每个引用占用4个字节)
  4. D:填充物占用的空间(后面说明什么是填充物)

下面我们对A、B、C 和 D 逐一解释

A:对象头

  内存中,每个对象占用的总空间不仅包含对象内声明的变量所需要的空间,还包括一些额外信息,比如:对象头 和 填充物。“对象头”的作用是用来记录一个对象的实例名字、ID 和 实例状态(例如,当前实例是否“可到达”,或者当前锁的状态等等)。

在当前的JVM版本中(Hotspot),“对象头”占用的字节数如下:

 

  1. 一个普通对象,占用8 bytes
  2. 数组,占用 12 bytes,包含普通对象的 8 bytes + 4 bytes(数组长度)
B:基本类型

 

boolean、byte 占用 1 byte,char、short 占用 2 bytes,int、float 占用 4 bytes,long、double 占用 8 bytes

C:引用类型

  每个引用类型占用 4 bytes

D:填充物

在Hotspot中,每个对象占用的总空间是以8的倍数计算的,对象占用总空间(对象头+声明变量)不足8的倍数时候,自动补齐。而,这些被填充的空间,我们可以称它为“填充物”。我们看下具体实例:

 

  1. 一个空对象(没有声明任何变量)占用 8 bytes -- > 对象头 占用 8 bytes
  2. 只声明了一个boolean类型变量的类,占用 16 bytes --> 对象头(8 bytes) + boolean (1 bytes) + 填充物(7 bytes)
  3. 声明了8个boolean类型变量的类,占用 16 bytes --> 对象头(8 bytes) + boolean (1 bytes) * 8
通过上面的实例,更有助于我们理解。^_^
分享到:
评论

相关推荐

    java知识点汇总

    根据给定的文件信息,这里将对Java知识点进行汇总,尤其关注Java Web架构及原理方面的知识。 首先,从【标题】:“java知识点汇总” 和【描述】:“内容较杂,有java初中高级知识点,也有Java web架构及原理”来看...

    学习android需要的Java知识点列表.pdf

    ### 学习Android所需Java知识点概述 为了更好地掌握Android开发技术,深入了解并熟练掌握Java语言是必不可少的基础之一。本文将根据“学习android需要的Java知识点列表”中的内容,详细阐述学习Android开发过程中...

    java知识点总结思维导图(xmind)

    这份"java知识点总结思维导图(xmind)"是为帮助学习者系统性地理解和掌握Java核心技术而精心整理的资料。思维导图作为一种有效的学习工具,能够帮助我们更好地组织和记忆信息,提高学习效率。 首先,让我们从基础...

    java知识点积累

    java知识点积累

    学习Android所需的Java知识点列表

    学习Android所需的Java知识点列表

    91.java知识点补充.zip

    91.java知识点补充.zip91.java知识点补充.zip91.java知识点补充.zip91.java知识点补充.zip91.java知识点补充.zip91.java知识点补充.zip91.java知识点补充.zip91.java知识点补充.zip91.java知识点补充.zip91.java知识...

    Java知识点总结2019

    Java知识点总结2019,其中包括了基础、面向对象、api部分、集合类、多线程、GUI、Jdbc、网络编程、io流。

    java知识点思维导图.xmind

    java知识点思维导图.xmind

    离线Java知识点大全

    离线模式下的Java知识点下载,可在线进行代码编写,直观地看出代码运行结果

    学习android需要的java知识点列表.txt

    学习android需要的java知识点列表,提供给想学习android的朋友

    JAVA知识点总结.pdf

    关于java语言设计理念 抽象类与接口的区别是什么 java为什么不支持多继承 java里的枚举实现机制是什么 java中的内部类 关于类Collections,Arrays,Objects java里的方法重载 关于java里的main方法

    java知识点总结思维导图xmind格式

    Java知识点总结思维导图Xmind格式的资源是一个非常有价值的工具,尤其对于正在学习或复习Java编程语言的人来说。这个压缩包包含8个独立的Xmind文件,每个文件都专注于Java的不同领域,提供了清晰、结构化的知识框架...

    Java知识点总结 最全面 最新版

    Java基础知识点总结 详细分析 图解

    java知识点梳理

    文档梳理了Java基本语法知识——环境搭建、数据类型、运算符、控制流、数组、Arrays类、字符串、类和对象、对象的生成与销毁、Java包&方法调用&访问控制、封装和继承、多态、继承链、抽象类和接口等等。

    java知识点详解

    文档中详细讲述java基础知道,对刚入门或入门不久的职场人非常有帮助。

    Java知识点.xmind

    Java知识点.xmind

    java知识点资料-txt

    这份Java知识点资料旨在为初学者和有一定经验的开发者提供全面的Java编程语言基础。Java是一门强大而灵活的面向对象编程语言,广泛应用于企业级应用、移动应用和嵌入式系统等多个领域。以下是这份资料包含的主要知识...

    JAVA知识点总结.zip

    java知识点总结 包括: 1.jvm、基础知识、多线程 2.spring、springMVC、springBoot 3.sql优化、mybatis 4.SpringCloud、restful api、docker等

    java 知识点总会

    总结了java知识点,为初学者学习java搭建了好的知识平台,能够让初学者对java有更深的了解。

Global site tag (gtag.js) - Google Analytics