java - Java .class 文件的最大大小是多少?

标签 java jvm specifications .class-file

.class 文件是一个相当well documented format它定义了部分和大小,因此也定义了最大大小。

例如,.class 文件包含一个魔数(Magic Number)(4 个字节)、一个版本(4 个字节)、常量池(可变大小)等。但大小可以在多个级别:可以有 65535 个方法,每个方法限制为 65535 个字节。

其他限制是什么?而且,如果您要制作最大的 .class 文件,它会有多大?

如果需要,请将答案限制为 Java。这意味着如果 Scala 或 Clojure(或...)更改了一些限制,请忽略这些值。

最佳答案

JVM 规范没有强制限制类文件,因为类文件是可扩展的容器,支持 arbitrary custom attributes ,您甚至可以根据需要将其最大化。

每个 attribute has a size field u4 类型的,因此,可以指定最多 2³²-1 (4G​​iB) 的数量。因为在实践中,JRE API(ClassLoader 方法、Instrumentation API 和 Unsafe)都始终使用 byte[]ByteBuffer 来描述类文件,不可能创建超过 2³¹-1 个字节(2GiB)的类文件的运行时类。

换句话说,即使是单个自定义属性的大小也可能超过实际可加载类的大小。但是一个类可以有 65535 个属性,加上 65535 个字段,每个字段有 65535 个自己的属性和 65535 个方法,每个方法最多也有 65535 个属性。

如果您进行数学计算,您会得出结论,仍然格式良好的类文件的理论最大值可能超过任何实际存储空间(超过 2⁶⁵ 字节)。

关于java - Java .class 文件的最大大小是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42294998/

相关文章:

java - org.springframework.http.converter.HttpMessageNotReadableException 调用休息后调用时

elasticsearch - JVM缓冲池只会增长

java - 垃圾收集器Java应用程序无法释放POD Kubernetes中的内存。

java - 当编译后的代码加载到 DVM 中时,DVM 如何管理内存?

java - .class 文件的名称和位置在哪里定义?

javascript - JavaScript 中的渲染何时更新?

java - Java Protocol Buffers 能否在重复字段的列表 getter 上返回 null?

java - 如何使用 Spring Autowire 编写 JUnit 测试?

java - 通过Java okhttp客户端通过HTTPS/SSL连接时出现问题

css - 为什么 CSS 命名的网格区域不在引号中?