我是新来的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装载的类文件? 它会做到这一点时,第一次使用类 - 包含以下几种情况:
- 创建类的实例一:新的运营商,反射,克隆法或反序列化。
- Inoking类的静态方法。
- 使用或评估,除了最后的静态变量的类或接口的静态变量,因为它们是编译时间常数。
- 调用由反射的方法。
- 加载类的子类。 它的工作原理只是上课,除了接口。
- 引导类的JVM。 例如。 包含main方法的类。
- 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装载的类文件,它加载所有的方法到什么地方? 像法区域?或本地方法栈?
类(方法)区存储每个类结构,如运行时的常量池,字段和方法的数据,方法的代码。