2 回答
TA贡献1856条经验 获得超11个赞
当我们在记事本或任何 IDE 上编写代码时,所有信息都会转换为 RAM 上的位。
在某个阶段,计算机上的所有数据都是 RAM 中的位。
而且编译后的.class文件已经有了jvm可以理解的指令。创建 .class 文件时,此信息也已在 RAM 上。
在创建类文件之前,它不在 RAM 中。类文件中的数据就是编译代码时 RAM 中的数据。
那么为什么 jvm 需要在 RAM 上称为方法区的特殊内存空间来“加载类数据”。
它必须在某个地方,并且由于它与其他类型的数据具有不同的生命周期,因此对其进行不同的管理是有意义的。
我了解到方法区具有与我们执行的类相关的元数据。但是,当我们运行它时,当您已经在 RAM 上存在 .class 文件信息时,为什么您需要更多的内存空间。
您可能需要解压缩信息或将其转换为本机代码以进行优化。
仅仅是为了更快的计算吗?
是的,每次都重新读取 .class 文件,这很慢。
或者方法区的信息和我理解的完全不同。?
它存储从.class
文件派生的信息以及如何使用类中的方法。
TA贡献1786条经验 获得超11个赞
我认为您对现代操作系统具有虚拟内存系统这一事实感到困惑。当您编译 Java 代码时,生成的字节码将在编译发生时保存在物理内存中。但是,编译器有自己的虚拟地址空间。虚拟内存系统将物理地址映射到进程特定的虚拟地址。它还确保其他进程无法读取或修改其他进程使用的物理内存(除非您使用称为共享内存的特殊安排)。
当 JVM 运行时,它有自己的虚拟内存地址空间,并将所有类文件信息加载到该地址空间中。为了使事情井井有条,它将这些数据放在方法区中。
从理论上讲,您可以直接从编译器进程使用的内存区域中读取编译后的代码,但要使其工作(以及不寻常的情况)会非常复杂,因此不会以这种方式完成。
添加回答
举报