00:00
这些面试题Java们应该都很熟悉,如果你总是背了又忘,忘了又背,归根结底还是对JVM没有一个系统的认识,那么希望通过这个视频可以为你构建一个连贯的GVM框架。众所周知,高级编程语言编写的程序最终要转化为机器码才可以在计算机上运行。我们在编写完一段Java代码后,如果想要运行它,需要通过Java编译器将其编译为JVM认识的字节码文件,然后执行Java命令,这段代码就会通过GM运行。在这个过程中,GVM就充当了转换的角色,负责将字节码翻译成对应平台上的机器指令。这样的话,Java程序就可以在任何安装了JVM的平台上运行,这就是Java语言依次编写、到处运行的跨平台特性。翻译字解码的工作是由JVM的执行引擎完成,在这之前还需要将字节码文件加载到JVM中,这个工作是由类加载系统完成。另外,为了在运行时方便管理内存,JVM定义了一个专门的区域,也就是大名鼎鼎的运行时数据区,所以类加载系统运行时数据区执行引擎就构成了GVM平台。接下来我们看一下他们是如何工作的。执行Java命令后。
01:39
Java虚拟机启动,类加载系统就开始工作了。类加载系统首先会读取指定的类文件,并遵循双亲委派机制进行加载,将文件中的常量池、字段、方法和指令等数据加载到JVM内存的共享区域、方法区中,然后对其进行验证,目的是为了确保类的正确性,比如版本号为52或更高时,不应该存在这个版本不支持的指令,或者标识类违建的魔术数字是不是咖啡baby等完整性的检查和约束。
02:19
验证完成后,在方法区为类的静态变量分配内存并设置默认值,紧接着将常量池中表示对象的符号引用指向到实际的内存地址,也就是直接引用,最后执行静态代码块为静态变量设置初始值,被加载工作就算完成了。静态变量为什么要先设置默认值?在设置初始值知道的评论区留言静态代码块被执行时,执行引擎就会处理这些指令。有两种工作模式,一种是解释执行,就是每次执行都会逐行解释字节码指令,另一种是即时编译,是将热点代码编译成当前平台的机器码并缓存,下次就可以直接执行机器码,提高执行效率。第二个问题,知道的评论区留言静态代码块执行完成后,JVM会继续调用卖方法。如果执行。
03:19
Java命令的字节码文件中没有main方法,JVM就会报错。调用Main方法时,会在内存中分配线程私有的空间、程序计数器和战帧。程序计数器会指向第一条指令,然后随着指令的执行不断递增,执行静态变量赋值的指令时,会把整数推送到战争中的操作数站。随后复制给静态变量。执行创建对象的指令时,如果该类还未被加载,类加载器就会启动加载过程,随后在堆中分配一块内存并初始化实例。这个过程中就涉及到对内存分带设计对象、内存分配过程、内存分配方式等知识点。如果对象过多导致空间不足,GVM就会通过垃圾回收来释放一些空间。如何确定对象是垃圾,使用哪个垃圾回收器,用了什么回收算法,就需要我们去了解。
04:21
实例初始化后,会将对象的引用存储到局部变量表中,这样的话线程就可以通过引用访问到该对象。后续的代码会延续这个流程,继续执行该加载类的加载类,该翻译指令的翻译,该分配内存的分配,该回收垃圾的回收,直到Java虚拟机停止工作。JVM的工作流程大概就是这样。如果对某些知识点感兴趣,欢迎访问派程序员前往了解或者评论区交流,感谢大家的支持,我们下期再见。
我来说两句