RAM <4GB 的 64 位 VM 上 Java 中的对象标头大小

2023-11-26

我想知道如果 JVM 的可用 RAM 是 4GB,是否有某种方法可以让 64 位 VM 使用 8 字节对象头而不是 12 字节对象头。

或者说在 Linux 上是这样的,如果不是在 Windows 上的话?有人可以用这段代码测试一下吗?

import java.lang.reflect.Field;
import sun.misc.Unsafe;
public class ObjectSizes {
    String s1;
    String s2;
    public static void main(String[] args) throws Exception {
        Unsafe unsafe;
        try {
            Field field = Unsafe.class.getDeclaredField("theUnsafe");
            field.setAccessible(true);
            unsafe = (Unsafe)field.get(null);
        } catch (Exception ex) {
            throw new RuntimeException("Can't get Unsafe instance.", ex);
        }
        Field s1Field = ObjectSizes.class.getDeclaredField("s1");
        Field s2Field = ObjectSizes.class.getDeclaredField("s2");
        long s1OffSet = unsafe.objectFieldOffset(s1Field);
        long s2OffSet = unsafe.objectFieldOffset(s2Field);
        System.out.println("We are running "+System.getProperty("java.version"));
        System.out.println("Object header size is "+s1OffSet+" bytes.");
        System.out.println("Object reference size is "+(s2OffSet-s1OffSet)+" bytes.");
    }
}

看起来 64 位 JVM 上不可能有 8 字节的对象头。标头由“标记字”、指向对象类的指针、数组大小(如果是数组)以及到达下一个 8 字节边界的填充组成。

  ,------------------+------------------+------------------ +---------------.
  |    mark word     |   klass pointer  |  array size (opt) |    padding    |
  `------------------+------------------+-------------------+---------------'
  • 标记字可用于存储本机指针实现锁并帮助GC,所以在64位JVM上占用8个字节。
  • 对于小于 32GB 的堆,指向对象类的指针被压缩为4字节.
  • 填充可用于存储字段之一。

因此,64 位系统上的对象头可以占用少至 8 + 4 = 12 字节,但不能更少。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RAM <4GB 的 64 位 VM 上 Java 中的对象标头大小 的相关文章

  • PE 文件中的跳转存根

    最近我反汇编了一个DLL 用c c 编写 发现代码段内有很多 跳转存根 这些存根除了跳转到 DLL 内的函数之外什么也不做 eg jmp foo jmp foo2 为什么编译器 Visual studio 2012 在二进制文件中包含这些函
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • Java 泛型/类型调度问题

    考虑以下程序 import java util List import java util ArrayList public class TypeTest public static class TypeTestA extends Type
  • Google Inbox 类似 RecyclerView 项目打开动画

    目前 我正在尝试实现 Google Inbox 例如RecyclerView行为 我对电子邮件打开动画很好奇 我的问题是 该怎么做 我的意思是 他们使用了哪种方法 他们用过吗ItemAnimator dispatchChangeStarti
  • Java 重写 hashCode() 得到 StackOverflowError

    所以我不太熟悉重写 hashCode 并且我似乎在 hashCode 方法中以某种方式进行了一些无限递归 这是我的场景 我有一个 DuplicateCache 类 它是一个缓存对象 用于检查系统中的重复对象 我有一个静态内部类 Duplic
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • PropertySources 中各种源的优先级

    Spring引入了新的注释 PropertySources对于所有标记为的类 Configuration since 4 0 需要不同的 PropertySource作为论证 PropertySources PropertySource c
  • 如何将 Spotlight for Help 插入本地化的 macOS 应用程序?

    我正在 macOS 上使用 Swing GUI 框架实现 Java 应用程序 当使用system外观和感觉以及screen菜单栏 Swing 自动插入一个搜索栏 called 聚光灯寻求帮助 https developer apple co
  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • 使用 Guava 联合两个 ImmutableEnumSets

    我想联合两个ImmutableEnumSets来自番石榴 这是我的尝试 public final class OurColors public enum Colors RED GREEN BLUE YELLOW PINK BLACK pub
  • sudo pip install python-Levenshtein 失败,错误代码 1

    我正在尝试在 Linux 上安装 python Levenshtein 库 但每当我尝试通过以下方式安装它时 sudo pip install python Levenshtein 我收到此错误 命令 usr bin python c 导入
  • 打印包含 JBIG2 图像的 PDF

    请推荐一些库 帮助我打印包含 JBIG2 编码图像的 PDF 文件 PDFRenderer PDFBox别帮我 这些库可以打印简单的 PDF 但不能打印包含 JBIG2 图像的 PDF PDFRenderer尝试修复它 根据 PDFRedn
  • 如何从页眉和/或页脚确定 PE 可执行文件的大小

    假设您有要雕刻的数据流或字节块 如何确定可执行文件的大小 PE 可执行文件格式中有许多标头 但是我使用哪些标头部分来确定 如果可能 可执行文件的总长度 这是文件格式的图片 如果PE文件格式良好 计算可以简化为 伪代码 size IMAGE
  • jmap - 组织和堆操作会给 jvm 带来开销吗?

    正如标题所述 需要多少开销jmap histo and jmap heap分别带到jvm 如果一个内存敏感的 Java 进程处于OutOfMemory 例如 大约 96 的堆已满 并且无法通过 full gc 清除 其中一项操作是否有可能将
  • 如何为 Jackson 编写一个包罗万象的(反)序列化器

    当您提前知道类型时 编写自定义序列化器非常容易 例如 MyType一个人可以写一个MyTypeSerializer extends StdSerializer
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 从java中的字符串数组中删除空值

    java中如何从字符串数组中删除空值 String firstArray test1 test2 test4 我需要像这样没有 null 空 值的 firstArray String firstArray test1 test2 test4
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你

随机推荐

  • 使用 linq 删除列表中的重复项

    我有课Items with properties Id Name Code Price 名单Items填充有重复的项目 例如 1 Item1 IT00001 100 2 Item2 IT00002 200 3 Item3 IT00003 1
  • 使用数据注释的有条件必需的属性

    我有一堂这样的课 public class Document public int DocumentType get set Required public string Name get set Required public strin
  • JAVA使用google语音识别API

    我正在尝试使用谷歌语音识别 API 这是我写的代码 http pastebin com zJEhnJ74 有用 我从服务器得到答案 status 5 id 8803471b14a2310dfcf917754e8bd4a7 1 hypothe
  • MySQL - 唯一外键

    我必须使其中一个外键唯一 问题是 我从 phpMyAdmin 收到以下消息 The following indexes appear to be equal and one of them should be removed consign
  • 查询 DNS 服务记录以查找主机名和 TCP/IP

    在一篇关于生命科学标识符 see LSID Tester 用于测试生命科学标识符解析服务的工具 罗德里克 DM 佩奇博士写道 给定 LSID urn lsid ubio org namebank 11815 在 DNS 中查询 SRV 记录
  • 从已使用的命名空间中排除类

    我所有 C 文件的第一条语句是 使用系统 现在 在框架版本 4 中 该命名空间包含一个名为 Action 的类 这也是我自己的代码中经常使用的命名空间中的类的名称 现在当然有冲突 当然 我可以通过在我之前使用 Action 的地方使用显式的
  • C++ 中的构造函数和对象数组

    我正在尝试用 C 创建一个应用程序 在应用程序中 我有默认构造函数和另一个带有 3 个参数的构造函数 用户从键盘提供一个整数 该整数将用于使用非默认构造函数创建对象数组 不幸的是 到目前为止我还无法完成它 因为我在创建对象数组时遇到问题 它
  • Rails:Turbo Stream Broadcast 不更新视图

    我有一个 Turbo Stream 它没有更新视图 我不知道为什么 我在类似的配置中设置了另外两个广播 运行良好 从我所看到的来看 一切看起来都应该正常工作 我只是没有在前端获得更新 我错过了一些明显的事情吗 partial div div
  • 打开文件时出现“无效参数”错误(并且不读取文件)

    我正在尝试编写代码 在文本文件中获取 2 个数字 然后将它们分开 将答案显示为最重的分数 当我在程序中输入自己的值时 我已经让分数部分开始工作 但我无法让程序识别文本文件 我尝试将它们放在同一目录中并放置文件的完整系统路径 但到目前为止没有
  • 使用供应商目录中的 autoloader.php 自动加载无法正常工作

    我在自动加载 Composer 时遇到问题 因为自动加载器无法解析 Doctrine ORM Mapping Table 对于单元测试 我创建了带有典型注释的学说实体类
  • Akka 中 Actorref.tell 和 inbox.send 的区别

    所以我开始学习 Akka 并尝试 typesafe 中的示例 所以 Hello Akka 应用程序有以下代码 import akka actor ActorRef ActorSystem Props Actor Inbox import s
  • 如何计算两个日期之间的周数?

    如何计算两个日期之间的周数 例如如下 Declare StartDate as DateTime 01 Jan 2009 Declare EndDate as DateTime 01 June 2009 StartDate and EndD
  • 我可以在 LESS css 字符串插值中进行数学运算吗?

    我的这个少了 我不知道如何在字符串内进行数学运算 bp tablet landscape 1024px bp tablet portrait 768px tablet landscape only only screen and min w
  • 如何在 grails 中断开对象与其休眠会话的连接?

    我正在尝试执行此操作 但出现错误 具有相同标识符值的不同对象已与会话关联 看来我需要从休眠会话中删除 dbObject def object messageParserService parseMessage messageType mes
  • 使用 XML1.1 解析 unicode 字符 (0x2)

    在我的 Java 应用程序中 我需要解析包含控制字符的 XML 文档0x2在 CDATA 内 我尝试了几种方法但无法通过 我想避免任何类型的编码 XML1 1有什么办法吗 我需要解析 CDATA 中包含控制字符 0x2 的 xml 那么那不
  • 我的网站 IE 总是崩溃,无法调试

    我的网站突然开始使 Internet Explorer 崩溃 网站加载并开始执行 javascript 但机器在某个地方爆炸了 我什至没有收到脚本错误 它只是崩溃了 我尝试使用内置调试器手动单步执行每一行 js 但问题当然不会发生 如果我选
  • .NET Framework x509Certificate2 类,HasPrivateKey == true && PrivateKey == null?

    我正在尝试使用最初使用 MMC 的 证书 管理单元导入到 Windows 10 计算机上的 CurrentUser 密钥库中的 X509 证书 相同的过程已在 Windows 8 1 计算机上进行了测试 得到了相同的结果 使用标准 Powe
  • 用java保存时图像改变颜色[重复]

    这个问题在这里已经有答案了 当我保存这张图片时 用这个方法 private final static Path ROOT PATH Paths getPath C images private static void saveImageFr
  • 删除变量并不会从 RAM 内存中删除其内存

    我广泛使用 Python Canopy 进行地球科学应用 因为我的应用程序很消耗内存 所以我试图找到方法来删除程序中不再需要的变量 我尝试使用 del 命令来删除变量内存 但我发现 Canopy 使用的空间仍然是相同的 关于如何从内存中完全
  • RAM <4GB 的 64 位 VM 上 Java 中的对象标头大小

    我想知道如果 JVM 的可用 RAM 是 4GB 是否有某种方法可以让 64 位 VM 使用 8 字节对象头而不是 12 字节对象头 或者说在 Linux 上是这样的 如果不是在 Windows 上的话 有人可以用这段代码测试一下吗 imp