java 虚拟机
jvm是一个虚拟机,虚拟的计算机。jvm是一个软件,由c写的软件。
它是一个设计图,具体实现可以有其他的公司实现,如oracle等等
它提供一个java‘代码’可以运行的地方,由此对于一个系统只要安装有jvm就可以运行java代码。我们都知道java代码是比较高级的计算机语言,而计算语言是我们用来给计算写程序的文字,用来告诉计算机将如何工作的工具。
jvm的工作是加载代码,然后效验代码之后处理代码,提供运行环境。
jvm有一些东西:
内存区域:内存设备是一个用存储代码的与数据的东西,为了方便处理不同的内存地址区域存放不同的东西,就像家里面的鞋柜,衣柜一样都占据的一个固定的空间
类文件格式:规定的class文件的格式
寄存器集:一堆寄存器,可能是cpu的寄存器吧
垃圾收集堆:(garbage-collected heap):堆是一个数据结构,它就像可以处理排着队吃饭的人,可以改变的这些人吃饭的优先顺序。
致命错误报告功能:有致命错误报告记录的功能
我们来看看jvm的内部结构。首先意识到jvm是一个软件,运行在操作系统之上的软件,他与硬件之间隔着操作系统。
jvm里面有类加载器,有jvm分配与管理的内存区域以及处理引擎。
首先我们讲一下jvm里面管理分配的内存区域,这些内存区域包括。
类区域(class area),这里存储着每一个类的结构,比如运行时的常量池,属性和方法相关数据,关于方法的指令代码
堆区域:这个地址区域是运行时的地址区域,对象的储存在这里。
stack:这个区域存储局部一个frame变量和一些临时的计算机结果,以及涉及方法的调用和返回。每一个线程有一个jvm stack,在创建的thread的同时会创建一个jvm stack。方法的调用会有一个frame被创建,方法执行完后这个frame就被销毁。
程序计数寄存器:这里储存者当前正在被执行的jvm虚拟机指令。
本机方法栈:这里包含所有在程序中使用的本机方法。
上面讲的是jvm的内存分配图,但是这些对应的内存现在是空空的需要有一个东西吧我们的写的java这些代码给传上去,也就是加载上去,jvm里面有个叫的类加载器的东西,它就是干这个的。jvm里有个内置的类加载器,最为原始的类加载器是boostrap classloader,他加载一个名叫rt.jar的文件,里面包含那些标准的java 类文件,想java.util package,java.net package java.lang package这些。是所有类加载的父类。
以及一个它的扩展类extension classloader加载$JAVA_HOME/jre/lib/ext directory目录下的java类文件。
以及extension的扩展类system/application classloader 他加载来classpath的类文件。默认的文件地址的当前的文件夹。可以-cp 或者-classpath改变classpath
现在我们来到了最后一个地方,execution engine,它与jvm分配管理得内存地址交互。jvm是一个虚拟的计算机,那么有了内存那就要有处理器,专门读取内存里的程序然后返回处理的结果。有个个中断器读取字节流然后处理的里面的指令。有一个jit compiler,将java 虚拟机指令变成指定的cpu可以执行的指令。一个虚拟的处理器。