JVM(HotSpot):所有方法都去哪儿了? 方法区? 本机方法堆栈?

我是JVM(HotSpot)的新手,并尝试理解它的架构及其工作原理,所以我的问题是所有的方法(静态和非静态)都被转换成字节码吗? 当JVM加载类文件时,它是否将所有方法加载到某个地方? 像方法区? 或本机方法堆栈?

它依赖于JVM实现 – 不同的JVM可以选择以不同的方式处理它(只要它们符合Java规范)。 所以你没有绝对的保证。

在Sun / Oracle JVM中,方法数据被加载到一个称为“永久生成”的特殊内存区域,该区域是垃圾收集器为类等长期对象保留的内存区域。

大多数其他“工业级”JVM可能会做类似的事情。

看到:

PS

这些都是非常高级的东西 – 你绝对不需要知道任何关于这一点的东西来充分利用Java和/或JVM。 您通常应该假设JVM代表您进行内存管理,并且会有效地执行内存管理 – 它需要专家多年的调优。

JVM的重点是让你抽象出特定平台的实现细节,毕竟……

确切地说,

  • 所有方法(静态和非静态)都将加载到方法Area中。

  • 方法调用,局部变量,中间结果和执行行将存储在Stack中。

  • 如果正在执行某个方法,它将位于堆栈顶部。 一旦完成执行,所有结果都将被删除,如果有任何本地引用变量,它们将被取消。

  • 无论正在执行哪种方法,方法Area都有类信息。 它类似于浏览器中的缓存,保存JVM所需的信息。

是的,所有方法都被翻译成字节码。 字节码文件是jvm将从中加载的中间文件。

当jvm加载类文件? 它将在首次使用类时执行 – 包含几种情况:

  1. 创建类的实例:new运算符,reflection,克隆方法或反序列化。
  2. 引用类的静态方法。
  3. 使用或评估除最终静态变量之外的类或接口的静态变量,因为它们是编译时常量。
  4. 通过reflection调用方法。
  5. 加载类的子类。 它只适用于除接口外的类。
  6. jvm的bootstrap类。 例如。 包含main方法的类。
  7. 当实现接口的类初始化但必须加载时,接口不需要初始化。

是的,方法被加载到方法区域。 换句话说,字节代码文件被加载到方法区域中。

我一般建议您阅读这篇关于JVM基本知识的精彩文章。

https://anturis.com/blog/java-virtual-machine-the-essential-guide/

Java进程消耗的内存可以分为Java和Native堆。 Java堆是由大小为Xmx的jvm分配的内存部分,用于java对象分配,其中作为由JNI代码分配的本机内存部分和由本机语言完成的分配。 这是将所有方法(静态和非静态)转换为字节码吗?

用java编写的代码被翻译成字节代码,用于访问,而不管访问说明符或修饰符

当JVM加载类文件时,它是否将所有方法加载到某个地方? 像方法区域?或本机方法堆栈?

类(方法)区域存储每类结构,例如运行时常量池,字段和方法数据,方法的代码。