一、JVM的组成
回答:在JVM中共有四大部分,分别是Class Loader(类加载器)、Runtime Data Area(运行时数据区,内存分区)、Execution Engine(执行引擎)、Native Method Library(本地库接口)。
它们的运行流程是:
第一,类加载器(ClassLoader)把Java代码转换为字节码文件
第二,运行时数据区(Runtime Data Area)把字节码加载到内存中,而字节
码文件只是JVM的一套指令集规范,并不能直接交给底层系统去执行,而是
有执行引擎运行
第三,执行引擎(Execution Engine)将字节码翻译为底层系统指令,再交
由CPU执行去执行,此时需要调用其他语言的本地库接口(Native Method
Library)来实现整个程序的功能。
2、JVM 运行时数据区
运行时数据区包含了堆、方法区、栈、本地方法栈、程序计数器这几部分,每个功能作用不一样。
堆解决的是对象实例存储的问题,垃圾回收器管理的主要区域。
方法区可以认为是堆的一部分,用于存储已被虚拟机加载的信息,常量、静态变量、即时编译器编译后的代码。
栈解决的是程序运行的问题,栈里面存的是栈帧,栈帧里面存的是局部变量表、操作数栈、动态链接、方法出口等信息。
本地方法栈与栈功能相同,本地方法栈执行的是本地方法,一个Java调用非Java代码的接口。
程序计数器(PC寄存器)程序计数器中存放的是当前线程所执行的字节码的行数。JVM工作时就是通过改变这个计数器的值来选取下一个需要执行的字节码指令
3、程序计数器的作用
java虚拟机对于多线程是通过线程轮流切换并且分配线程执行时间。在任何的一个时间点上,一个处理器只会处理执行一个线程,如果当前被执行的这个线程它所分配的执行时间用完了【挂起】。处理器会切换到另外的一个线程上来进行执行。并且这个线程的执行时间用完了,接着处理器就会又来执行被挂起的这个线程。这时候程序计数器就起到了关键作用,程序计数器在来回切换的线程中记录他上一次执行的行号,然后接着继续向下执行