猿问

Java .class 文件信息在生成时已经在 RAM 上。那么为什么jvm要有一个特殊的方法区呢?

当我们在记事本或任何 IDE 上编写代码时,所有信息都会转换为 RAM 上的位。而且编译后的.class文件已经有了jvm可以理解的指令。创建 .class 文件时,此信息也已在 RAM 上。

那么为什么 jvm 需要在 RAM 上称为方法区的特殊内存空间来“加载类数据”。 我了解到方法区具有与我们执行的类相关的元数据。但是,当我们运行它时,当您已经在 RAM 上存在 .class 文件信息时,为什么您需要更多的内存空间。

仅仅是为了更快的计算吗?或者方法区的信息和我理解的完全不同。?


叮当猫咪
浏览 179回答 2
2回答

呼唤远方

当我们在记事本或任何 IDE 上编写代码时,所有信息都会转换为 RAM 上的位。在某个阶段,计算机上的所有数据都是 RAM 中的位。而且编译后的.class文件已经有了jvm可以理解的指令。创建 .class 文件时,此信息也已在 RAM 上。在创建类文件之前,它不在 RAM 中。类文件中的数据就是编译代码时 RAM 中的数据。那么为什么 jvm 需要在 RAM 上称为方法区的特殊内存空间来“加载类数据”。它必须在某个地方,并且由于它与其他类型的数据具有不同的生命周期,因此对其进行不同的管理是有意义的。我了解到方法区具有与我们执行的类相关的元数据。但是,当我们运行它时,当您已经在 RAM 上存在 .class 文件信息时,为什么您需要更多的内存空间。您可能需要解压缩信息或将其转换为本机代码以进行优化。仅仅是为了更快的计算吗?是的,每次都重新读取 .class 文件,这很慢。或者方法区的信息和我理解的完全不同。?它存储从.class文件派生的信息以及如何使用类中的方法。

Qyouu

我认为您对现代操作系统具有虚拟内存系统这一事实感到困惑。当您编译 Java 代码时,生成的字节码将在编译发生时保存在物理内存中。但是,编译器有自己的虚拟地址空间。虚拟内存系统将物理地址映射到进程特定的虚拟地址。它还确保其他进程无法读取或修改其他进程使用的物理内存(除非您使用称为共享内存的特殊安排)。当 JVM 运行时,它有自己的虚拟内存地址空间,并将所有类文件信息加载到该地址空间中。为了使事情井井有条,它将这些数据放在方法区中。从理论上讲,您可以直接从编译器进程使用的内存区域中读取编译后的代码,但要使其工作(以及不寻常的情况)会非常复杂,因此不会以这种方式完成。
随时随地看视频慕课网APP

相关分类

Java
我要回答