这一讲主要来讲解JVM
是Java虚拟机,一种能够运行Java字节码的虚拟机,以堆栈结构来进行实做。Java虚拟机就可以看作是一台特殊的电脑,运行的软件只有一种即Java程序。
Java虚拟机针对的对象是字节码文件并不是某一个特定的语言。
Java虚拟机是以一个进程的方式运行在操作系统中的,Java虚拟机在运行的时候就是操作系统中的一个进程实例。
javac指令将我们写的Java源文件翻译成Java虚拟机可以执行的字节码文件,也就是class文件(也叫做本地文件)。
当我们输入java这个指令,就会启动一个Java程序,这个Java程序运行起来就是一个Java虚拟机进程,这个进程启动之后就会把相应的类加载进内存中,加载进内存之后就会对这个类进行初始化和动态链接,接下来就是从这个类的main方法开始执行了。
字节码文件被加载进内存之后不是直接在cpu上执行,而是被Java虚拟机进程托管着,需要由Java虚拟机对这个字节码文件进行一系列的操作。
字节码文件是被Java虚拟机中的类加载器加载的,然后由这个虚拟机进程去解释这个class文件中的字节码指令。然后再把这个字节码指令翻译成本机cpu能够识别的指令,然后再在cpu上运行。
字节码文件也就是class文件,是由Java虚拟机中的类加载器来加载的,但是这个加载是按照需要来加载的,也就是只有当一个类需要的时候才去加载这个类,并不是一开始就会加载所有的类。只有当一个类需要的时候才去加载这个类,并不是一开始就会加载所有的类。
当一个类加载进Java虚拟机内部之后,Java虚拟机会读取字节码文件中存在的字节码指令,在Java虚拟机中读取字节码指令的部分叫做执行引擎。
实现对内存的自动管理,不需要手动写代码进行内存的释放,会自动进行内存分类和释放。
属于JVM内存中较小的一个内存空间。在多线程中,是靠CPU来切换线程的执行顺序,例如,从线程A切换到线程B,再切换回线程A的时候,CPU是如何知道应该执行线程A的哪一步,之前线程A执行到哪靠程序计数器去记录。
栈内存准确来说应该是Java虚拟机栈中的局部变量表,基本数据类型是存放在Java虚拟机栈中的局部变量表中。
当线程开始就产生Java虚拟栈,当一个方法调用的时候就产生一个栈帧。栈帧的作用就是用来存放局部变量表,操作数栈,动态链接和方法出口信息。
局部变量表是用来存放各种数据类型,对象的引用。
一个方法从调用到执行结束的整个过程就是一个栈帧在Java虚拟机中从入栈到出栈。
Java虚拟机栈和本地方法栈极为相似只是服务的对象不同,Java虚拟机栈是为java方法服务的,本地方法栈是为使用到的Native方法服务
所有的实例对象和数组都在这里存储,也是垃圾回收器主要工作的地方,所以堆内存也叫作gc堆,也就是垃圾堆。
堆内存是所有线程所共享的。
方法区是多个线程共享的,存放已经被虚拟机加载的类信息,常量、静态变量等数据信息,在方法区中还存在一个运行时常量池。
常量池用于存放编译阶段生成的各种字面量和符号引用。
上一篇:数据结构六:堆
下一篇:机器学习从零到入门 逻辑回归详解