首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么几乎所有的Java二进制文件都具有相同的大小

几乎所有的Java二进制文件都具有相同的大小是因为Java编译器在将Java源代码编译成字节码文件(.class文件)时,会将源代码中的每个类都编译成一个独立的字节码文件。这些字节码文件包含了类的结构、方法、变量等信息。

Java字节码文件采用了一种统一的格式,即Java虚拟机字节码(Java Virtual Machine bytecode),这种格式是与平台无关的。由于Java虚拟机需要解释执行字节码文件,因此为了提高执行效率,Java字节码文件经过了优化处理,使得它们的大小相对固定。

具体来说,Java字节码文件的大小主要受以下几个因素影响:

  1. 类的结构和代码复杂性:一个类的结构和代码越复杂,生成的字节码文件就越大。这是因为复杂的类需要存储更多的信息,如方法、字段、注解等。
  2. 使用的库和框架:如果在Java程序中使用了大量的库和框架,生成的字节码文件会相应增大。这是因为库和框架的代码会被编译到字节码文件中。
  3. 代码重复和共享:如果多个类之间存在代码重复或共享的情况,编译后的字节码文件会共享这部分代码,从而减小文件大小。
  4. 编译器优化:Java编译器会对生成的字节码文件进行优化,包括去除无用的代码、合并相似的代码等,从而减小文件大小。

总的来说,几乎所有的Java二进制文件具有相同的大小是因为Java编译器生成的字节码文件遵循统一的格式,并经过了优化处理,使得它们的大小相对固定。这种设计有助于提高Java程序的可移植性和执行效率。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么你要学习 Go?

Go 直接在底层硬件上运行 与其他现代高级语言(如 Java/Python)相比,使用 C、C++ 的最大好处就是它的性能,因为 C/C++ 是编译型语言而不是解释型语言。 处理器能理解二进制文件。...通常来说,当你编译一个用 Java 或者其他基于 JVM 的语言构建的应用程序,它将人类可读的代码编译为字节代码,这可以被 JVM 或者在底层操作系统之上运行的其他虚拟机所理解。...当执行的时候,虚拟机解释这些字节码并且将他们转化为处理器能理解的二进制文件。 而另一个方面,C/C++ 不会在 VM 上执行,并且从执行周期中删除(编译为字节代码)这一步提高性能。...它直接将人类可读的代码编译为二进制文件。 但是,在这些语言中释放和分配变量是一件极其痛苦的事情。虽然大部分编程语言都使用垃圾回收器或者引用计数的算法来处理对象的分配和移除。...Go 的的设计者在谷歌创建这门语言的时候就考虑到了这一点,由于谷歌拥有非常强大的代码库,成千上万的开发者都工作在相同的代码库上,代码应该易于其他开发者理解,一段代码应该对另一段代码有最小的影响。

57711

为什么我放弃了运维必学必会的 Python,而选择了更加高大上的 Go?

处理器能理解二进制文件。...通常来说,当你编译一个用 Java 或者其他基于 JVM 的语言构建的应用程序,它将人类可读的代码编译为字节代码,这可以被 JVM 或者在底层操作系统之上运行的其他虚拟机所理解。...当执行的时候,虚拟机解释这些字节码并且将他们转化为处理器能理解的二进制文件。 ?...基于虚拟机语言的执行步骤 而另一个方面,C/C++ 不会在 VM 上执行,并且从执行周期中删除(编译为字节代码)这一步提高性能。它直接将人类可读的代码编译为二进制文件。 ?...Go 的的设计者在谷歌创建这门语言的时候就考虑到了这一点,由于谷歌拥有非常强大的代码库,成千上万的开发者都工作在相同的代码库上,代码应该易于其他开发者理解,一段代码应该对另一段代码有最小的影响。

1.3K10
  • 彻底搞懂Java动态代理

    以上代码演示了,通过字节码加载成class对象的过程 2、运行期生成二进制字节码 JVM通过字节码的二进制信息加载类,如果我们在运行期的系统中,遵循Java编译系统组织.class文件的格式和结构,生成相应的二进制数据...能够以二进制形式修改已有类或者动态生成类。ASM可以直接产生二进制 class 文件,也可以在类被加载入Java虚拟机之前动态改变类行为。...下边一段代码生成一个跟前面JavaDeveloper几乎一样的类ASMDeveloper,使用上一小节的LoadClass类运行有相同的输出 ?...3、为什么是InvocationHandler 我们已经具有能力动态修改一个类的代码,使用ASM哪怕生成一个非常简单的类,代码量也是又多又复杂。仔细思考代理模式中的代理Proxy角色。...换一种思路就是,在触发(invoke)真实角色的方法之前或者之后做一些额外的业务。为了构造出具有通用、简单的代理类,可以将所有的触发真实角色动作交给一个触发的管理器。

    95231

    彻底搞懂Java动态代理

    以上代码演示了,通过字节码加载成class对象的过程 2、运行期生成二进制字节码 JVM通过字节码的二进制信息加载类,如果我们在运行期的系统中,遵循Java编译系统组织.class文件的格式和结构,生成相应的二进制数据...能够以二进制形式修改已有类或者动态生成类。ASM可以直接产生二进制 class 文件,也可以在类被加载入Java虚拟机之前动态改变类行为。...下边一段代码生成一个跟前面JavaDeveloper几乎一样的类ASMDeveloper,使用上一小节的LoadClass类运行有相同的输出 ?...3、为什么是InvocationHandler 我们已经具有能力动态修改一个类的代码,使用ASM哪怕生成一个非常简单的类,代码量也是又多又复杂。仔细思考代理模式中的代理Proxy角色。...换一种思路就是,在触发(invoke)真实角色的方法之前或者之后做一些额外的业务。为了构造出具有通用、简单的代理类,可以将所有的触发真实角色动作交给一个触发的管理器。

    1.8K41

    Python 平台是独立的吗?

    由于其广泛的库支持,它在机器学习和人工智能中很有用。 Python 平台是独立的吗? 编程语言Python是一个独立于二进制平台的。相同的 Python 代码几乎可以在任何平台或操作系统上执行。...Java和Python是这种语言的两个例子。 源平台独立性 独立于源平台的语言只需对其源代码进行极少的更改甚至无需更改即可在许多系统上运行。但是,每个平台都需要重新编译源代码。...但是,必须遵循某些措施来保证与其他平台的兼容性。这里有几个插图—— 许多操作系统使用区分大小写的文件名。 在Linux上,我们有“root”,但在Windows上,我们有“管理员”。...相同的 Python 代码几乎可以在任何平台或操作系统上执行。使用 Python 时,必须采取某些预防措施来减少兼容性问题,例如注意区分大小写和避免使用特定模块。...为什么 Python 是跨平台的? Python 是一种跨平台、解释型、面向对象的编程语言,适用于脚本编写、链接现有组件和快速应用程序开发 (RAD)。

    1.7K20

    Rust FFI 编程 - FFI 概述

    严格来说,FFI 与 绑定,意义并不相同,绑定可以理解为 FFI 中的一种实现。 不同语言实现 FFI 的方式不尽相同。...有的语言,比如,要调用 C 库,必须用 C 语言,按那种语言的绑定规范,实现一个 C 项目,用 C 编译器编译并链接,生成库文件,再由这种语言调用(这种语言本身已经实现了加载其定义的规范 C 库的能力)...所有的语言在编译后,都会以二进制的形式去执行(即使编译后的代码为字节码,虚拟机在运行的时候,也会继续翻译成 CPU 认识的二进制指令)。这就为不同语言间的调用提供了可能性。 但是,可能归可能。...因此,这些语言和 Java 之间,以及这些衍生语言之间,能比较容易地实现相互调用。 JVM 平台的缺点在于,其生态中的成果,被局限在了 JVM 平台内,无法(或很难)被其它语言平台所享用。...目前几乎所有主流语言都已实现将 WASM 作为编译目标,并且有相当一部分语言能够加载 WASM 库文件,调用其中的函数。不同的语言编译出的 WASM 效能和体积大小也是不同的。

    1.1K20

    Java 基本功 (基础概念与常识)

    1.Java 虚拟机(JVM) 是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。...这也解释了我们为什么经常会说 Java 是编译与解释共存的语言。...它拥有 JRE 所拥有的一切,还有编译器(javac)和工具(如 javadoc 和 jdb)。它能够创建和编译程序。 JRE 是 Java 运行时环境。...OpenJDK 和 Oracle JDK 的代码几乎相同,但 Oracle JDK 有更多的类和一些错误修复。...Java 语言既具有编译型语言的特征,也具有解释型语言的特征,因为 Java 程序要经过先编译,后解释两个步骤,由 Java 编写的程序需要先经过编译步骤,生成字节码(*.class 文件),这种字节码必须由

    48621

    【附答案】Java面试2019常考题目汇总(一)

    Windows操作系统的目录结构,是以盘符为单位,C盘、D盘、E盘等等,数据存储在各个盘符之下,而Linux操作系统最顶层只有一个根目录root,所有文件都存储在这一个根目录之下。...2.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。...JDK(Java Development Kit)即为Java开发工具包,包含编写Java程序所必须的编译、运行等开发工具以及JRE。...(3)通过使用JDK附带的集合类,可以降低代码维护成本。 (4)复用性和可操作性。 19.集合框架中的泛型有什么优点? Java1.5引入了泛型,所有的集合接口和实现都大量地使用它。...我们知道在Java中最常用的两种结构是数组和模拟指针(引用),几乎所有的数据结构都可以利用这两种来组合实现,HashMap也是如此。

    53510

    Java面试2018常考题目汇总

    Windows操作系统的目录结构,是以盘符为单位,C盘、D盘、E盘等等,数据存储在各个盘符之下,而Linux操作系统最顶层只有一个根目录root,所有文件都存储在这一个根目录之下。...2.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。...JDK(Java Development Kit)即为Java开发工具包,包含编写Java程序所必须的编译、运行等开发工具以及JRE。...(3)通过使用JDK附带的集合类,可以降低代码维护成本。 (4)复用性和可操作性。 19.集合框架中的泛型有什么优点? Java1.5引入了泛型,所有的集合接口和实现都大量地使用它。...我们知道在Java中最常用的两种结构是数组和模拟指针(引用),几乎所有的数据结构都可以利用这两种来组合实现,HashMap也是如此。

    58730

    阿里字节跳动90%被问到的JVM面试题

    ,把存活对象和垃圾对象进行标记;第二步:将所有的存活的对象向一段移动,将端边界以外的对象都回收掉;特点:适用于存活对象多,垃圾少的情况;需要整理的过程,无空间碎片产生; 复制算法:将内存按照容量大小分为大小相等的两块...类加载器是指:通过一个类的全限定性类名获取该类的二进制字节流叫做类加载器;类加载器分为以下四种:启动类加载器:用来加载java核心类库,无法被java程序直接引用; ?...为了防止内存中出现多个相同的字节码;因为如果没有双亲委派的话,用户就可以自己定义一个java.lang.String类,那么就无法保证类的唯一性; 十二、怎么打破双亲委派模型?...;软引用可以和引用队列联合使用,如果软引用所引用的对象被垃圾回收器所回收了,虚拟机会把这个软引用加入到与之对应的引用队列中; 弱引用:弱引用是用来描述一些可有可无的对象,在java中用WeakReference...来表示,在垃圾回收时,一旦发现一个对象只具有软引用的时候,无论当前内存空间是否充足,都会回收掉该对象;弱引用可以和引用队列联合使用,如果弱引用所引用的对象被垃圾回收了,虚拟机会将该对象的引用加入到与之关联的引用队列中

    44232

    Java面试2018常考题目汇总(一)

    Windows操作系统的目录结构,是以盘符为单位,C盘、D盘、E盘等等,数据存储在各个盘符之下,而Linux操作系统最顶层只有一个根目录root,所有文件都存储在这一个根目录之下。...2.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。...JDK(Java Development Kit)即为Java开发工具包,包含编写Java程序所必须的编译、运行等开发工具以及JRE。...(3)通过使用JDK附带的集合类,可以降低代码维护成本。 (4)复用性和可操作性。 19.集合框架中的泛型有什么优点? Java1.5引入了泛型,所有的集合接口和实现都大量地使用它。...我们知道在Java中最常用的两种结构是数组和模拟指针(引用),几乎所有的数据结构都可以利用这两种来组合实现,HashMap也是如此。

    819100

    Android内存管理(JVM 、DVM(dalvik) 、ART简介)

    Java程序执行流程: ? 从上图可以看到Java虚拟机与java语言没有什么必然联系,它只与特定的二进制文件:Class文件有关。...虚拟机栈的特点: 线程私有; 生命周期与线程相同; 两类异常 线程请求的栈深度大于虚拟机所允许的深度时抛出 StackOverflowError 异常; 栈扩展时无法申请到足够的内存时抛出 OutOfMemoryError...可以看出,直接内存的大小并不受到java堆大小的限制,甚至不受到JVM进程内存大小的限制。...当JVM加载该.jar文件的时候,会加载里面的所有的.class文件,JVM的这种加载方式很慢,对于内存有限的移动设备并不合适。...而在.apk文件中只包含了一个.dex文件,这个.dex文件里面将所有的.class里面所包含的信息全部整合在一起了,这样再加载就提高了速度。.

    1.9K10

    Hello——Java10新特性,请了解一下

    因为var是一个类型引用对象,它和表达式右边的类型具有相同的属性。  ...这是 Oracle 正在努力确保 OpenJDK 二进制和 Oracle JDK 二进制功能上一样的工作的一部分,是一项有用的补充内容。...✔ 在备用存储装置上的堆分配   硬件技术在持续进化,现在可以使用与传统 DRAM 具有相同接口和类似性能特点的非易失性 RAM 。...▪ java.util.Properties:   增加了一个新的构造函数,它接受一个 int 参数。这将创建一个没有默认值的空属性列表,并且指定初始大小以容纳指定的元素数量,而无需动态调整大小。...如果 JarEntry 不代表一个多版本 jar 文件的版本化条目或者 jar 文件没有被配置为作为一个多版本 jar 文件进行处理,这个方法将返回与 ZipEntry.getName()返回的相同名称

    55550

    Hello——Java10新特性,请了解一下

    因为var是一个类型引用对象,它和表达式右边的类型具有相同的属性。  ...这是 Oracle 正在努力确保 OpenJDK 二进制和 Oracle JDK 二进制功能上一样的工作的一部分,是一项有用的补充内容。...✔ 在备用存储装置上的堆分配   硬件技术在持续进化,现在可以使用与传统 DRAM 具有相同接口和类似性能特点的非易失性 RAM 。...▪ java.util.Properties:   增加了一个新的构造函数,它接受一个 int 参数。这将创建一个没有默认值的空属性列表,并且指定初始大小以容纳指定的元素数量,而无需动态调整大小。...如果 JarEntry 不代表一个多版本 jar 文件的版本化条目或者 jar 文件没有被配置为作为一个多版本 jar 文件进行处理,这个方法将返回与 ZipEntry.getName()返回的相同名称

    83850

    JVM之内存管理(一)

    通过JVM(C/C++所开发)的,将Java程序编译生成 .class 文件,称为字节码文件。...它通过模拟一个计算机来达到一个计算机所具有的的计算功能。...2.1 运行时数据区 JVM在执行Java程序时会把其所管理的内存划分成多个不同的数据区域,每个区域的创建时间、销毁时间以及用途都各不相同。...Java源文件经编译后得到存储字节码的Class文件,Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件中。...2.4 Heap Space (Java堆) Java堆是JVM所管理的最大一块内存,所有线程共享这块内存区域,几乎所有的对象实例都在这里分配内存,因此,它也是垃圾收集器管理的主要区域。

    38540

    译 - 为什么要学习Go?

    **但是,大多数现代编程语言(如Java,Python等)都来自90年代的单线程环境。**这些编程语言大多数都支持多线程。但是真正的问题在于并发执行,线程锁定,竞争条件和死锁。...例如,在Java中创建新线程效率不高。由于每个线程消耗大约1MB的内存堆大小,最终如果您开始旋转数千个线程,它们将对堆施加巨大压力,并由于内存不足而导致关闭。...与其他现代高级语言(例如Java / Python)相比,使用C,C ++的最大好处是它们的性能。因为C / C ++是经过编译而不进行解释的。 处理器了解二进制文件。...在执行时,VM解释这些字节码并将其转换为处理器可以理解的二进制文件。 ? `基于VM的语言的执行步骤` 另一方面,C / C ++无法在VM上执行,这从执行周期中删除了一个步骤,从而提高了性能。...它直接将人类可读的代码编译为二进制文件。 ? 但是,释放和分配这些语言中的变量是一个巨大的痛苦。大多数编程语言都使用垃圾收集器或引用计数算法来处理对象分配和删除。 Go带来了两全其美的优势。

    59450

    Java 字符流文件读写

    上篇文章,我们介绍了 Java 的文件字节流框架中的相关内容,而我们本篇文章将着重于文件字符流的相关内容。...,第一个方法用于读取一个字符出来,如果已经读到了文件末尾,将返回 -1,同样的以 int 作为返回值类型接收,为什么不用 char?...关于 read,它依赖成员属性 in 的读方法,而 in 作为一个 Reader 类型,内部往往又依赖的某个 InputStream 实例的读方法。 所以说,几乎所有的字符流都离不开某个字节流实例。...,而只是将它们所对应的字符串写入文件,例如: print(123); 最终写入文件的不是 123 所对应的二进制表述,而仅仅是 123 这个字符串,这就是打印流。...---- 文章中的所有代码、图片、文件都云存储在我的 GitHub 上: (https://github.com/SingleYam/overview_java)

    1.2K20

    HashMap你真的了解吗?

    所有列表都注册在一个 Entry 数组(Entry[] 数组)中,这个内部数组的默认容量是 16。 图片 下图显示了具有可为空条目数组的 HashMap 实例的内部存储。...所有具有相同哈希值的键都放在同一个链表(桶)中。具有不同哈希值的键最终可能在同一个桶中。...,其二进制表示为 0..0111010011100 0011,相关索引为 0…0 0011 = 3 这就是为什么数组大小是 2 的幂。...此调整大小操作的目的是减小链表的大小,以便 put()、remove() 和 get() 方法的时间成本保持较低。调整大小后,其键具有相同哈希的所有条目将保留在同一个桶中。...如果所有的节点都是Nodes,那么JAVA 8 HashMap的内存消耗和JAVA 7 HashMap是一样的。

    2.2K30

    程序员需要了解的硬核知识之操作系统入门

    ,可能入门都算不上吧,毕竟操作系统太庞大和复杂了。...从程序的运行环境这一角度来考量的话,CPU 的种类是特别重要的参数,为了使程序能够正常运行,必须满足 CPU 所需的最低配置。 CPU 只能解释其自身固有的语言。...这也就是为什么 Windows 应用程序不能直接移植到 Linux 操作系统上的原因,API 差异太大了。 在同类型的操作系统下,不论硬件如何,API 几乎相同。...提供相同运行环境的 Java 虚拟机 总算是提到大 Java 了, Java 大法好,除了虚拟机的方法之外,还有一种方法能够提供不依赖于特定硬件和操作系统的程序运行环境,那就是 Java。...大家说的 Java 其实有两层意思,一种是作为编程语言的 Java;一种是作为程序运行环境的 Java。Java 与其他语言相同,都是通过源代码编译后运行的。

    65620

    JVM系列(一)—— 何为JVM

    JVM的全称是Java Virtual Machine(Java虚拟机),它通过模拟一个计算机来达到一个计算机所具有的计算功能。我们先来看看一个真实的计算机如何才能具备计算的功能。...当前,不同的硬件平台的差异已经被更上一层的软件平台所代替了,这个软件平台就是操作系统,与其说不同的硬件平台还不如说操作系统之间的差异,因为现在的操作系统几乎完全屏蔽了硬件。...make clean用于删除编译时产生临时的目录或文件 值得注意的是,我们通常所说的编译器都是将某种高级语言直接编译成可执行的目标机器语言(实际上,在windows下,是需要动态链接的目标二进制文件,DLL...再说,如何让机器(不管是实体机还是虚拟机)执行代码的主题,不管是何种指令集,都只有最基本的元素,加减乘除,求余,求模等。这些运算又可以进一步分解成二进制位运算,与或非,异或等。...为了指令的紧凑性,因为java的字节码会在网络上传输,所以class文件的大小也是设计JVM字节码指令的一个重要因素,如在class文件中字节码除了处理两个表跳转的指令外,其他全都是字节对齐的,操作吗可以只占一个字节大小

    56110
    领券