JVM(HotSpot):所有方法都在哪里?方法区?本机方法堆栈?

时间:2012-08-06 02:48:20

标签: java jvm native-methods

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

6 个答案:

答案 0 :(得分:2)

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

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

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

请参阅:

P.S。

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

JVM的重点是让你从具体平台的实现细节中抽象出来,毕竟......

答案 1 :(得分:1)

准确地说,

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

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

  • 如果正在执行某个方法,它将位于堆栈顶部。一旦它 完成执行所有结果将被删除,如果有的话 本地参考变量,它们将无效。

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

答案 2 :(得分:1)

1。)是否将所有方法(静态和非静态)都转换为字节码?

  • 是的,一个类的所有成员,无论是静态的还是非静态的,都会得到 转换为字节码。编译器负责所有 此翻译/编译。

2。)JVM加载类文件时,是否将所有方法都加载到某个地方?喜欢方法区吗?或本机方法堆栈?

  • 获取类的整个字节码(包括方法字节码) 加载到相应的类块中。
  • 类块是方法区域内在逻辑上分开的存储块,用于存储其各自类的类级别数据,例如 字节码,方法表和静态变量。

enter image description here enter image description here enter image description here

  • 类级数据与实例无关,即为什么不存储它 在堆中类的实例(对象)中。所有对象之间共享一个类级数据的单个副本。
  • 因此,此问题的简单答案是“所有类字节码(包括方法的字节码)都已加载到方法区域中”。
  • 要了解有关方法区访问的更多信息 https://www.artima.com/insidejvm/ed2/jvm5.html或参考 SCJP / Oracle学习指南

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

  
    

用java编写的代码被翻译成字节代码,无论访问说明符还是修饰符

都可以访问   

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

  
    

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