Java对象存储内存布局详解

Java对象存储内存布局详解

Java 是一门面向对象的编程语言,因此在 Java 程序中创建对象是很常见的。在 Java 虚拟机(JVM)中,对象在内存中是如何存储和布局的呢?接下来我们将详细介绍 Java 对象存储内存布局的实现。

Java对象存储

Java 对象有两种主要的存储区域:堆和栈。

  1. 堆:是 Java 程序中最常见的内存区域,用来存储所有的对象和数组。所有的线程共享 Java 堆。

  2. 栈:是线程私有的内存区域。它用来存储线程运行时的栈帧。每个栈帧(Stack Frame)存储一个方法(Method)的局部变量表、操作数栈和帧数据(Frame Data)。

Java对象内存布局

Java 对象在内存中的布局由三部分组成:对象头(Header)、实例数据(Instance data)和对齐填充(Padding)。

对象头(Header)

对象头是对象在内存中的开头部分,包含两个部分的数据:标记字(Mark Word)和类型指针(Klass Pointer)。

  1. 标记字(Mark Word):包含了对象的哈希码、锁状态、分代年龄等信息。大多数的 JVM 实现使用32位的标记字,但在一些具有大内存支持的 JVM 中,可以使用64位标记字。

  2. 类型指针(Klass Pointer):用于指向对象所属的类,也称为 Class Metadata Address。

实例数据(Instance data)

实例数据是指对象实际存储的数据部分,即程序员自定义的成员变量和方法。

对齐填充(Padding)

对齐填充(Padding)是指填充字节,用于占用一定的内存,以对齐下一个对象。Java 要求对象在内存中的起始地址必须是8的倍数,因此为了达到这个要求,JVM需要额外的填充一些字节。

示例说明

下面两个示例用于说明 Java 对象的内存布局。

示例一

public class Test {
    private int i;
    private Object obj;
}

对于这个示例,Test 类实例化后占用的内存空间如下:

对象头:markword(32位)+ klass pointer(32位)= 8字节
实例数据:int i(4字节)+ object obj(4字节)= 8字节
对齐填充:不需要填充
--------------------------------------
总共:8字节

示例二

public class Test {
    private int i;
    private Object obj;
    private byte b;
}

对于这个示例,Test 类实例化后占用的内存空间如下:

对象头:markword(32位)+ klass pointer(32位)= 8字节
实例数据:int i(4字节)+ object obj(4字节)+ byte b(1字节)= 9字节
对齐填充:填充3字节
--------------------------------------
总共:20字节

对于这两个示例,我们可以看到对象头和实例数据不难理解,重点是对齐填充的理解,这是因为按内存对齐要求,每个对象在内存中的数值地址都应该是8的倍数,如此可能会带来空间浪费。因此,jvm会通过对齐填充的方式,来补齐空间,保证每个对象的内存地址都能够是8的倍数,达到了对性能的优化效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java对象存储内存布局详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Java中关于http请求获取FlexManager某设备分组监控点

    在Java中发送HTTP请求,可以使用Java内置的HttpURLConnection类或者第三方库如OkHttp、HttpClient等。以下是获取FlexManager某设备分组监控点的攻略。 准备工作 在发送HTTP请求前,需要导入相应的依赖包,例如使用OkHttp时,需要在pom.xml中添加以下依赖: <dependency> <…

    Java 2023年5月26日
    00
  • Java利用位运算实现加减乘除的方法详解

    Java利用位运算实现加减乘除的方法详解 简介 Java位运算是操作二进制数的一种方式,包括位与、位或、位异或、位取反等操作。通过运用位运算的特殊性质,可以实现加减乘除等数学运算。本文将详细讲解Java中如何利用位运算实现加减乘除操作。 加法 位运算中的加法采用异或操作和与操作的组合实现。可以用以下公式表示: a + b = (a ^ b) + ((a &a…

    Java 2023年5月19日
    00
  • java在pdf中生成表格的方法

    生成表格是PDF文档中常见的需求之一,Java中有很多第三方库可以实现这一功能。以下是使用iText库生成表格的步骤: 第一步:导入iText库 在使用iText库之前,需要在项目中导入iText的jar文件。可以通过Maven等构建工具,或手动下载并导入jar文件。 第二步:创建PDF文档 可以使用iText库创建PDF文档,如下所示: Document …

    Java 2023年5月20日
    00
  • 常见的Java字节码操纵库有哪些?

    常见的Java字节码操纵库 Java字节码操纵库是指一些工具类库,用于在运行时动态修改Java字节码。常见的Java字节码操纵库有以下几种: ASM:是一个直接以Java字节码的形式生成、修改类的框架。它提供了一些比较底层的API,可以让开发者精细地控制字节码的生成和修改过程。 Javassist:是一个基于字节码操作的程序库,可以在运行时对字节码进行修改、…

    Java 2023年5月11日
    00
  • JS文本框不能输入空格验证方法

    确保JS文本框输入内容不包含空格可以通过验证输入内容的方法来实现。以下是实现JS文本框不能输入空格的完整步骤: 第一步:获取文本框中用户输入的内容 使用 JavaScript 获取该文本框中用户输入的内容,可以使用 document.getElementById() 方法或其他选择器。 let userInput = document.getElementB…

    Java 2023年6月15日
    00
  • java中List对象排序通用方法

    请允许我详细讲解一下“Java中List对象排序通用方法”的完整攻略。 一、List对象排序的基本思路 在Java中,List是一种常见的集合类型,可以用来存储一组数据。在实际开发过程中,我们会遇到需要对List中的数据进行排序的需求。通用的 List 对象排序方法需要以下步骤: 对于自定义对象,需要实现 Comparable 接口或者传入一个 Compar…

    Java 2023年5月26日
    00
  • JSONObject按put顺序排放与输出方式

    下面是有关”JSONObject按put顺序排放与输出方式”的攻略。 什么是JSONObject JSONObject是Java中的一个类,可以用于存储和操作JSON格式的数据。它能够将Java对象转换成JSON格式的字符串,也可以将JSON格式的字符串转换成Java对象。 JSONObject按put顺序排放 JSONObject是一种无序的数据结构,它并…

    Java 2023年5月26日
    00
  • Java中反射的学习笔记分享

    关于Java中反射的学习笔记分享,下面就详细讲解一下完整攻略。 什么是Java中的反射 Java中的反射机制是指在运行时动态地获取一个类的各种信息的能力。它能够在程序运行时直接操作对象的内部属性,调用对象的方法,它使得原本在编译时就需要确定的类名、方法名等信息可以在运行时通过反射机制动态获取。 Java中反射的使用场景 1.在设计一些通用使用的代码时,比如动…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部