75.md 3.6 KB
Newer Older
W
wizardforcel 已提交
1
# Java 开发人员必须知道..
W
init  
wizardforcel 已提交
2 3 4

> 原文: [https://javabeginnerstutorial.com/core-java-tutorial/java-developers-must-know/](https://javabeginnerstutorial.com/core-java-tutorial/java-developers-must-know/)

W
wizardforcel 已提交
5
## Java 虚拟机。 怎么运行的?
W
init  
wizardforcel 已提交
6

W
wizardforcel 已提交
7 8 9
*   首先 jvm 在类中查找`main`方法。如果存在,它将从该处开始执行
*   在 Java 虚拟机内部,线程有两种形式:**守护程序****非守护程序**。 守护程序线程通常是虚拟机本身使用的线程,例如执行**垃圾收集**的线程。 但是,该应用可以将其创建的任何线程标记为守护程序线程。 应用的初始线程(从`main()`开始的线程)是非守护程序线程。
*   只要任何非守护程序线程仍在运行,Java 应用就会继续执行(虚拟机实例继续运行)。 Java 应用的所有非守护程序线程都终止时,虚拟机实例将退出。 如果得到安全管理者的允许,则应用还可以通过调用`Runtime``System`类的`exit()`方法来使其自身灭亡。
W
init  
wizardforcel 已提交
10 11


W
wizardforcel 已提交
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
![](img/84ced9a2cb730f97cce54806e6a7946b.png)

**Java 虚拟机的体系结构**

*   所有的 JVM 都包含两个组成部分

*类加载器子系统*:一种机制,用于加载具有完全限定名称的类型(类和接口)。

*执行引擎*:一种机制,负责执行已加载类的方法中包含的指令。

*   当 Java 虚拟机运行程序时,它需要内存来存储许多东西,包括字节码,已加载的类文件中的信息,程序实例化的对象,方法的参数,返回值,局部变量以及中间的计算结果。
*   虚拟机的不同实现可能具有非常不同的内存限制。 一些实现可能需要大量内存才能工作,而其他实现可能很少。 一些实现可能能够利用虚拟内存,而其他一些则不能。 运行时数据区规范的抽象性质有助于简化在各种计算机和设备上实现 Java 虚拟机的过程。
*   不同的 Java 程序具有不同的 jvm 实例。 如果我执行一个类,则一个单独的 jvm 实例将处理该类
*   当虚拟机加载类文件时,它会从类文件中包含的二进制数据中解析有关类型的信息。 它将类型信息放入方法区域,将程序实例化的所有对象放入堆。
*   随着每个新线程的出现,它获得了自己的 *pc 寄存器*(程序计数器)和 *Java 栈*。 如果线程正在执行 Java 方法(不是本机方法),则 pc 寄存器的值指示要执行的下一条指令。 线程的 Java 栈存储该线程的 Java(非本机)方法调用状态。
*   Java 栈由*栈帧*(或*帧*)组成。 栈框架包含一个 Java 方法调用的状态。 当线程调用方法时,Java 虚拟机将新框架推送到该线程的 Java 栈上。 该方法完成后,虚拟机将弹出并丢弃该方法的帧
*   Java 虚拟机包含两种类加载器:`java.lang.ClassLoader` bootstrap 类加载器,用户定义的类加载器。
*   正在运行的程序的每个线程都有其自己的**程序计数器**寄存器或程序计数器,它们是在线程启动时创建的。 pc 寄存器的大小为一个字,因此它既可以保存本机指针,也可以保存 returnAddress。 当线程执行 Java 方法时,pc 寄存器包含该线程正在执行的当前指令的地址。 “地址”可以是本机指针,也可以是方法字节码开头的偏移量。 如果线程正在执行本机方法,则 pc 寄存器的值未定义。
*   这里有两个栈,Java 栈:由 JVM 维护,本机栈:取决于。

大家好,请评论我的帖子。 如果我的帖子有任何问题,请随时进行纠正,谢谢。