日渐习惯了加班,所以终于挤出一点时间来学习;之前面试被问到虚拟机运行机制跟运行原理,今天立马爬起来mark
- 虚拟机为我们干了什么,具体是怎么干的。希望能够理解到一些初学时不懂的东西
Java虚拟机是一个可以执行Java字节码的虚拟机进程,内部有一个类加载器子系统(ClassLoader),这个子系统用来在运行时根据需要加载类;
根据需要
在Java虚拟机执行过程中,只有需要一个类的时候,才会调用类加载器来加载这个类,并不会在开始运行时加载所有的类。
1.JVM如何处理Java的字节码文件?
由虚拟机加载的类,被加载到Java虚拟机内存中之后,虚拟机会读取并执行它里面存在的字节码指令。虚拟机中执行字节码指令的部分叫做执行引擎。Java虚拟机会进行自动内存管理。具体说来就是自动释放没有用的对象,而不需要程序员编写代码来释放分配的内存。这部分工作由垃圾收集子系统负责。
类的生命周期:加载、连接(验证,准备)、初始化、卸载
一个Java虚拟机实例在运行过程中有三个子系统来保障它的正常运行,分别是类加载器子系统, 执行引擎子系统和垃圾收集子系统。
2.什么是JVM的空间或者内存?
虚拟机的运行,必须加载class文件,并且执行class文件中的字节码指令。它做这么多事情,必须需要自己的空间。就像人吃下去的东西首先要放在胃中。这里的空间就是内存了。
虚拟机也需要空间来存放各种数据。首先,加载的字节码,需要一个单独的内存空间来存放;一个线程的执行,也需要内存空间来维护方法的调用关系,存放方法中的数据和中间计算结果;在执行的过程中,无法避免的要创建对象,创建的对象需要一个专门的内存空间来存放。
3.原 …?原理?
我们的.class文件不是直接被系统加载后直接在cpu上执行的,而是被一个叫做虚拟机的进程托管的。首先必须虚拟机进程启动就绪,然后由虚拟机中的类加载器加载必要的class文件,包括jdk中的基础类(如String和Object等),然后由虚拟机进程解释class字节码指令,把这些字节码指令翻译成本机cpu能够识别的指令,才能在cpu上运行。
在执行一个Java程序的时候,在执行的是Java虚拟机的进程,而不是我们写的class文件。这个叫做虚拟机的进程处理一些底层的操作,比如内存的分配和释放等等。我们编写的class文件只是虚拟机进程执行时需要的“食物”。这些“食物”在运行时被“吃”到虚拟机中,被虚拟机解释执行,以控制虚拟机实现我们Java代码中所定义的一些相对高层的操作
1: 虚拟机没有离我们很遥远,从操作系统的角度来看只是一个进程。
2: 虚拟机的进程比较特殊,它能够加载我们编写的class文件。如果把JVM比作一个人,那么class文件就是我们吃的食物。
3: 加载class文件的是一个叫做类加载器的子系统。就像我们的嘴巴,把食物吃到肚子里。
4: 虚拟机中的执行引擎用来执行class文件中的字节码指令。就好比我们的肠胃,对吃进去的食物进行消化。
5: 虚拟机在执行过程中,要分配内存创建对象。当这些对象过时无用了,必须要自动清理这些无用的对象。清理对象回收内存的任务由垃圾收集器负责。就好比人吃进去的食物,在消化之后,必须把废物排出体外,腾出空间可以在下次饿的时候吃饭并消化食物。