JVM(热点):哪里的所有方法去? 方法区? 本地方法栈?(JVM (HotSpot) : W

2019-09-20 20:52发布

我是新来的JVM(热点),并试图了解它的结构,它是如何工作的,所以我的问题是,做所有的方法(静态和非静态)得到翻译成字节码? 当JVM装载的类文件,它加载所有的方法到什么地方? 像法区域? 或本地方法栈?

Answer 1:

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

在Sun / Oracle的JVM中的方法得到的数据加载到名为“永久代”的特殊存储区,它是由垃圾收集器用于长期对象如类保留的存储器的区域。

大多数其他“工业强度”的JVM可能会做同样的事情。

看到:

  • https://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation
  • Java内存池是如何划分的?
  • http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

PS

这是所有相当先进的东西-你绝对不需要知道这事要好好利用Java和/或JVM的。 通常,您应该假设JVM确实代表你的内存管理,并会如此高效地完成 - 它是由专家们多年的调谐。

JVM的整个要点是允许你从抽象特定于平台的实现细节了,毕竟......



Answer 2:

准确地说,

  • 所有的方法(静态和非静态)将在方法区被加载。

  • 方法调用,局部变量,中间结果和执行的行会被存储在堆栈中。

  • 如果正在执行的方法,它会在堆栈的顶部。 一旦执行完毕所有的结果将被删除,如果有任何局部引用变量,他们将被废止。

  • 正在执行的方法不管,方法区拥有一流的信息。 它类似于在浏览器缓存,持有JVM所需要的信息。



Answer 3:

是的,所有的方法会转换成字节码。 而字节码文件是在JVM将加载中间文件。

当JVM装载的类文件? 它会做到这一点时,第一次使用类 - 包含以下几种情况:

  1. 创建类的实例一:新的运营商,反射,克隆法或反序列化。
  2. Inoking类的静态方法。
  3. 使用或评估,除了最后的静态变量的类或接口的静态变量,因为它们是编译时间常数。
  4. 调用由反射的方法。
  5. 加载类的子类。 它的工作原理只是上课,除了接口。
  6. 引导类的JVM。 例如。 包含main方法的类。
  7. A接口需要时实现接口的类intialized不被intialized,但必须加载。

是的,这些方法被装入方法区。 换言之,该字节码文件被加载到方法区。



Answer 4:

我一般会建议你阅读有关JVM的要领这篇大文章。

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



Answer 5:

通过Java进程所消耗的内存可以被归类为Java和本机堆。 Java堆是由大小XMX的JVM中分配的存储部分,其用于Java对象分配,其中如通过JNI代码和分配由本国语言进行分配的本地存储器部分。 是做所有的方法(静态和非静态)得到翻译成字节码?

用Java编写的代码被转换成字节代码,用于访问访问指示符或改性剂,而不管

当JVM装载的类文件,它加载所有的方法到什么地方? 像法区域?或本地方法栈?

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



文章来源: JVM (HotSpot) : Where do all the methods go ? method area ? native method stack?