# jAVA 初识jvm(一)

jAVA 初识jvm(一)


Jvm主要组成部分和作用

  • 作用:首先通过编译器把Java代码转换成字节码,类加载器把字节码加载到内存中,将其放在数据运行区的方法去中。字节码文件只是Jvm的一套指令规范,不能直接让操作系统去执行,因此需要特定的命令解析器将字节码文件翻译成底层系统指令,再交给Cpu去执行,而这个过程中需要调用其他语言的本地接口来实现整个程序的功能。
运行时数据区域(Jvm内存)

1.方法区域:类级别的数据存在这里,通过编译器把代码转换成字节码,类加载器将其放在数据运行区人的方法中。
2. 堆:对象、示例变量、数组存储在这里。由于方法区和堆区的内存由多个线程共享,所以存储的数据时不安全的。
3. 虚拟机栈:对每个线程创建一个栈。所有的局部变量将在栈内存中创建。栈区是线程安全的。

  • 栈:局部变量和相应的值。
  • 操作数栈:作为运行时工作区去执行指令。
  • 帧数据:方法所有的符号都保存在这里。在任何异常的情况下,Catch块的信息将会保存在帧数据里面。
    4.本地方法栈:保存本地方法信息,对每一个线程创建一个单独的本地方法栈。

5.PC寄存器:每个线程都有一个单独的PC寄存器来保存当前执行指令的地址,一旦指令执行,PC寄存器会被更新至下条指令的地址。

类加载子系统

1.类加载器:根据类名将class文件装载到运行时数据区域的方法区中

执行引擎

1.即时编译器:用解释器代码转换成字节码,重复的代码使用JIT编译器编译成本机代码,本机代码将直接用于重复的方法调用。提高系统性能。

  • 中间代码生成器:生成中间代码
  • 代码优化器:优化上面生成的中间代码
  • 目标代码生成器:负责生成机器代码或者本机代码
  • 探测器:负责寻找多次被调用的方法
    2.垃圾回收器:收集并且删除未应用的对象,可以调用System,gc()方法来触发垃圾回收机制。JVM的垃圾回收机制只收集由new创建出来的对象。所以如果不是new创建的对象,你可以使用finalize函数来执行清理。
本地库接口

和本地方法库交互,是其他编程语言交互的接口。

本地方法库
Jvm代码演示
package JVM;
/**
 * 1、当jvm进程启动后,到类方法中找main()的入口类HelloJvm
 * 2、找到HelloJvm后读取该文件中的二进制数据,并且把类的信息放到运行时的方法区内存区中
 * 3、定位到HelloJvm中main方法的字节码中,并开始执行Main方法中的指令
 * 4、创建HellowJvm1的实例对象,并且使用helloJvm1引用对象:
 *   (1)Jvm到方法区中查找HelloJvm1类的信息,此时发现没有该类的信息,由类加载器加载该HelloJvm类文件
 *   (2)在Jvm的方法区中加载并且找到HelloJvm1类后会在栈中为HelloJvm1的实例对象分配内存
 *   (3)Jvm实例化完成后会在当前线程中为栈中的引用建立实际的应用关系,此时会赋值给helloJvm1
 * 5、在Jvm中方法的调用一定属于线程的行为。方法的调用本身会发生在线程的方法调用栈。
 * 线程的方法调用栈,每一个方法的调用就是方法调用栈中的一个结构
 *该结构包含了方法的参数、局部变量临时数据等。
 * */
public class HelloJvm {
    public static void main(String[] args) {
        HellowJvm1 helloJvm1=new HellowJvm1("test");
        helloJvm1.sayHellow();
    }
}
class HellowJvm1 {
    //name本身作为成员放在栈中,name指向的String对象是放在堆中
    private String name;
    public HellowJvm1(String test) {
        this.name=test;
    }
    //放在方法区中
    public void sayHellow(){
        System.out.println("你好"+this.name);
    }
}

未完待续…

你可能感兴趣的:(Java)