当前位置: 首页 > 知识库问答 >
问题:

Java类文件的最大大小是多少?

孔阎宝
2023-03-14

A。类文件是一种有很好文档记录的格式,它定义了节和大小,因此也定义了最大大小。

例如,a。类文件包含一个幻数(4字节)、一个版本(4字节)、常量池(可变大小)等。但大小可以在多个级别上定义:可以有65535个方法,每个方法限制为65535字节。

其他限制是什么?如果你想做最大的。类文件可能是什么大小?

如果需要,限制对Java的回答。意思是如果Scala或Clojure(或…)改变一些限制,忽略这些值。

共有3个答案

孙斌
2023-03-14

具有方法的类的理论上的、半现实的极限很可能受到常量池的限制。所有方法中只能有64K<代码>java。awt。组件有2863个常量和83548个字节。具有相同字节/常量比率的类将以1.9 MB的速度耗尽常量池。相比之下,像com这样的类。太阳科尔巴。东南方。impl。登录中。ORBUtilSystemException的内存大约为3.1MB。

对于一个大型类,常量池中的常量可能会耗尽2-3MB。

根据合同sun.awt.motif.X11GB18030_1$Encoder充满了大型常量字符串,它是122KB,只有68个常量。这个类没有任何方法。

为了进行实验,我的编译在21800个左右的常量中使用了太多的常量。

public static void main(String[] args) throws FileNotFoundException {
    try (PrintWriter out = new PrintWriter("src/main/java/Constants.java")) {
        out.println("class Constants {");
        for (int i = 0; i < 21800; i++) {
            StringBuilder sb = new StringBuilder();
            while (sb.length() < 100)
                sb.append(i).append(" ");
            out.println("private static final String c" + i + " = \"" + sb + "\";");
        }
        out.println("}");
    }
}

此外,编译后的文件似乎会将文本加载到字节缓冲区中。这意味着源代码不能为1 GB,否则编译器会收到此错误。我猜字节中的字符溢出为负数。

java.lang.IllegalArgumentException
    at java.nio.ByteBuffer.allocate(ByteBuffer.java:334)
    at com.sun.tools.javac.util.BaseFileManager$ByteBufferCache.get(BaseFileManager.java:325)
楚承天
2023-03-14

使用嵌套的最终块很容易制作巨大的StackMapTable,因为javac不明智地为每个嵌套级别生成单独的变量。这允许从像这样非常简单的方法产生几兆字节:

class A {{
  int a;
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  a=0;
  }}}}}}}}}}}}
}}

添加更多嵌套级别是不可能的,因为您将超过单个方法的代码大小。您也可以使用实例初始化器复制到每个构造函数的事实来复制它:

class A {{
  int a;
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  try {a=0;} finally {
  a=0;
  }}}}}}}}}}}}
}
A() { }
A(int a) { }
A(char a) { }
A(double a) { }
A(float a) { }
A(long a) { }
A(short a) { }
A(boolean a) { }
A(String a) { }
A(Integer a) { }
A(Float a) { }
A(Short a) { }
A(Long a) { }
A(Double a) { }
A(Boolean a) { }
A(Character a) { }

}

这个简单的java文件在用Java8JavaC编译时产生105236439字节。类文件。您还可以添加更多的构造函数,尽管javac可能会因OutOfMemoryError而失败(使用javac-J-Xmx4G来克服这个问题)。

魏明亮
2023-03-14

JVM规范并不要求对类文件进行限制,因为类文件是可扩展的容器,支持任意自定义属性,所以您甚至可以随心所欲地将其最大化。

每个属性都有一个u4类型的大小字段,因此可以指定最多为2²-14GiB)。由于在实践中,JRE API(ClassLoader方法、Instrumentation API和Unsafe)都一致地使用byte[]ByteBuffer来描述类文件,因此不可能创建一个类文件的运行时类,该类文件的字节数超过2\-1字节(2GiB)。

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

如果你计算一下,你会得出结论,一个格式良好的类文件的理论最大值可能超过任何实际存储空间(超过2)⁶⁵ 字节)。

 类似资料:
  • 问题内容: 甲文件是一个相当有据可查的格式定义部分和大小,因此,最大尺寸为好。 例如,一个文件包含一个幻数(4个字节),一个版本(4个字节),常量池(可变大小)等。但是大小可以在几个级别上定义:您可以有65535个方法,每个方法都限于65535字节。 其他限制是什么? 而且,如果您要制作最大的文件,它将是多少? 如果需要,将答案限制为Java。这意味着如果Scala或Clojure(或…)更改了一

  • 问题内容: 我阅读了有关Lucene限制2Gb文档的说明。在Elasticsearch中可以建立索引的文档大小是否还有其他限制? 问题答案: Lucene内部使用一个字节缓冲区,该缓冲区使用32位整数进行寻址。根据定义,这限制了文档的大小。因此,理论上最大2GB。 在ElasticSearch中: ES GitHub代码中有一个,并将其设置为或。因此,基本上, 2GB是通过HTTP进行批量索引的最

  • 本文向大家介绍MongoDB中文档的最大大小是多少,包括了MongoDB中文档的最大大小是多少的使用技巧和注意事项,需要的朋友参考一下 该文档是集合中的记录。每个文档的大小限制为16 MB。文档包裹在大括号({})中。 让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出-

  • 问题内容: 由于(当前)仅支持将字符串作为值,并且为了做到这一点,需要先将对象进行字符串化(存储为JSON- string),然后才可以定义值的长度。 有谁知道是否存在适用于所有浏览器的定义? 问题答案: 储存空间 暗示,使用DOM存储,您具有比对Cookie施加的典型用户代理限制更大的存储空间。但是,提供的数量未在规范中定义,用户代理也没有有意义地广播。 如果您查看Mozilla源代码,我们可以

  • 问题内容: 由于(当前)仅支持将字符串作为值,并且为了做到这一点,需要先将对象进行字符串化(存储为JSON- string),然后才可以定义值的长度。 有谁知道是否存在适用于所有浏览器的定义? 问题答案: 引用有关Web存储的Wikipedia文章: 可以简单地将网络存储视为Cookie的一种改进,它提供了更大的存储容量(Google Chrome中每个原始站点10 MB,Mozilla Fire

  • 我正在使用PyCharm社区版2016,我注意到我无法打开大型数据输入文件或日志(20MB)。编辑简单地说“文件XXX太大(大小)”。 不仅如此,似乎没有办法改变限制。官方文档提到了一种增加使用intellisense的最大大小的方法,但根本没有增加可以打开的文件的最大大小。这是真的吗?这真的是一个完全无法打开大型日志的IDE吗?