栈帧操作指令 dup:在 new Object() 的字节码中,为什么要执行 dup 指令以复用对象引用

酷宇同学_4824

酷宇同学_4824

2026-05-05

934人浏览

原创

dup指令用于复制new生成的对象引用,确保invokespecial调用构造方法消耗一个引用后,栈中仍保留一个引用供后续赋值、方法调用等操作使用。

栈帧操作指令 dup:在 new object() 的字节码中,为什么要执行 dup 指令以复用对象引用

因为 invokespecial 调用构造方法时会消耗栈顶的对象引用,而 Java 语句(如 Object o = new Object() 或 new Object().toString())仍需保留一份引用用于后续操作——dup 指令就是为这个目的复制栈顶引用。

构造方法调用必须消耗一个引用

Java 中所有实例构造方法(<init></init>)都是实例方法,JVM 要求调用时显式传入 this 引用。当执行 invokespecial 时,它会从操作数栈弹出栈顶的一个引用作为 this,完成对象初始化。如果没有 dup,new 后栈中仅有一个引用,被构造方法取走后就没了,无法赋值、调用方法或返回。

dup 确保引用“一分为二”:一个给构造,一个留给程序

典型字节码序列如下:

Gaga
Gaga

一款AI视频创作工具,主要用于曹越团队开发的AI视频生成工具,适合需要提升相关任务效率的用户。

下载
  • new #2 → 在堆上分配对象,把引用压入栈顶(栈:[ref])
  • dup → 复制栈顶引用,压入后变成两个(栈:[ref, ref])
  • invokespecial #3 → 弹出一个 ref 作为 this 执行构造(栈:[ref])
  • 剩余的 ref 可用于:
     • 存入局部变量表(如 astore_1 实现 Object o = ...)
     • 直接调用实例方法(如 toString())
     • 抛出异常(如 throw new Exception())
     • 甚至被丢弃(此时编译器仍生成 dup + pop,但属极少数无用场景)

不 dup 的替代方案理论上存在,但不实用

比如 new 后立刻用 astore_n 把引用存到局部变量,再用 aload_n 推回栈来调构造——但这会增加指令数量和局部变量槽位占用,且破坏了栈式执行的紧凑性。JVM 设计选择 dup 是更高效、统一的机制:一次分配,双份可用,符合大多数代码的实际需求。

注意:dup 不是针对对象类型特设,而是栈操作的通用逻辑

dup 属于 JVM 通用栈指令,只关心“栈顶一个字长的数据”,与数据是对象引用、int 还是 float 无关。只要某条指令(如 invokespecial、invokevirtual、athrow)需要消耗一个引用,而上层语义又要求该引用继续存在,编译器就会插入 dup —— 这正是它在 new 后几乎必然出现的根本原因。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5007

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2248

6

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

20

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

40

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

20

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

20

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

20

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

240

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

140

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程