如果我对对象的引用多于 32 位所能容纳的数量,会发生什么情况?

2024-02-19

所以我刚刚了解到当你声明一个 Object 类型的变量时(即Object a;),为该变量分配 32 位空间。在这个变量/引用内部,有一个实际对象的内存地址。

现在假设我有足够大的内存来执行此操作。

What would happen if I created more than 4,294,967,296 (232) variables of type Object and tried assigning them to a distinct Object? Would some variables/references get the same memory addresses due to integer overflow? Meaning it's impossible to have references to more than 4,294,967,296 Objects in memory?


所以我刚刚了解到,当您声明一个 Object 类型的变量(即 Object a; )时,会为该变量分配一个 32 位空间。在这个变量/引用内部,有一个实际对象的内存地址。

(当您谈论“32 位空间”时,IT 人员会立即认为您指的是address空间...并且 32 位地址空间为您提供 2^32 字节的存储空间!!)

所以假设你actually意思是“32位ofspace” 你所说的可能是对的,也可能是错误的。对于 32 位 JVM,引用确实是 32 位长,这意味着你的程序(理论上)最多可以引用 2^32 个不同的对象,任何类型。即使表示 2^32 个不同的(32 位)引用也将占用 2^34 个字节。

另一方面,如果您在 64 位 JVM 上运行程序,则引用的大小为 64 位,这意味着您的程序(理论上)最多可以引用 2^64 个不同的对象。

但这都是理论上的。问题是在 32 位机器上,您的程序没有足够的内存来表示那么多不同的对象。 32 位机器上的最小 Java 对象占用(至少)8 个字节。因此,即使您拥有整个可用地址空间,您也只能表示 2^29 个对象。实际上,操作系统不会为 JVM 提供那么多内存。事实上,根据操作系统的不同,它最多可以获得 4Gb 地址空间中的 2 到 3Gb。


当然,如果您运行 64 位 JVM(在 64 位操作系统/和支持 64 位的硬件上),您就有更大的空间用于对象引用,并且可以有更多的内存来表示它们。但由于硬件限制,您最终仍然会“碰壁”。

值得注意的是,Java 还有其他各种固有的限制。例如,数组最多可以有 2^31 个元素,字符串最多可以有 2^31 个字符,字符串literals限制为 2^16 个字符,依此类推。这些限制比 32 与 64 位参考限制更为基本。


FOLLOWUP

因此,长话短说,无论我在编译时强制操作系统将多少内存专用于我的程序,总会有一堵预先确定的墙?

那是对的。 (有点。你不能强迫操作系统将内存专用于你的程序编译时间。内存大小是在您确定时确定的launch程序,而不是编译它时。)基本上,在程序启动时,您有以下“旋钮”需要旋转:

  • JVM(32 位与 64 位)对可寻址的内存量进行了限制,并确定引用是 32 位还是 64 位。 (请注意,这是一个运行时选择。32 位和 64 位编译的字节码文件是相同的。)

  • -Xms 和 -Xmx 表示堆应该有多大……受到可寻址性和操作系统准备提供给 JVM 进程的内存量的限制。

  • 还有一个压缩面向对象 http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html#compressedOop与 64 位 JVM 相关的功能,但通常默认情况下处于启用状态。

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

如果我对对象的引用多于 32 位所能容纳的数量,会发生什么情况? 的相关文章

  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐