java虚拟机总结

java虚拟机总结

java虚拟机是什么

    我们都知道java程序是在java虚拟机上运行的,那么java虚拟机是什么呢?
java虚拟机其实是一个抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

java虚拟机有什么用

   java中所有的类,都必须被装载到jvm中才能够运行,这个装载的操作是由jvm的类装载器完成的,装载器所做的工作实质是把类文件从硬盘读取到内存中.
  jvm它是实现跨平台的核心部分,所有的java程序会首先被编译为  .class的  类文件,这种类文件可以在虚拟机上执行。就是说class文件不是直接和机器的操作系统相对应的.
JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行.(一次编译,导出运行)

JVM运行时数据区域

java虚拟机总结

  1. 程序计数器
  2. 虚拟机栈
  3. 本地方法栈
  4. 方法区

程序计数器

【指向当前线程所执行的字节码的行号】,其实就是一小块内存,记录着当前程序运行到哪了字节码解释器的工作就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。分支,循环,跳转,异常处理,线程回复等都需要依赖这个计数器来完成。
由于Java的多线程是通过线程轮流切换完成的,一个线程没有执行完时就需要一个东西记录它执行到哪了,下次抢占到了CPU资源时再从这开始,这个东西就是程序计数器,正是因为这样,所以它也是“线程私有”的内存。
如果一个线程执行一个主要方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;

虚拟机栈

和程序记时器一样,虚拟机栈也是线程私有的,他的作用是:
   虚拟机栈描述的是Java的方法执行的内存模型,方法每个执行在同时的创建都会一个栈桢用于存储局部变量表.

局部变量表

      局部变量表存放了编译期可知的各种基本数据类型,对象引用(仅限局部变量的,不包含成员变量的)。其中每个局部变量空间只有32位,所以long和double类型的数据会占用两个局部变量空间,其他类型包括对象引用占用一个。对象引用调用的是存在堆中的对象,这个引用可以是对象的起始地址或者是指向对象的句柄。局部变量表所需的内存在编译期就已经确定了也就是进入这个方法时就已经确定了,运行期间不会更改。

如果方法1方法调用了方法2,那么方法1就会先入栈创建一个栈桢,接着方法2再入栈成为栈顶(假设没有其他的方法执行),方法2执行完先出栈,接着方法1执行完出栈。(先进后出)
在使用递归的情况下,如果线程请求的栈的深度超过虚拟机所允许栈的深度就会抛出*Error(栈内存溢出);但是大部分虚拟机栈的深度都可以动态扩展,HotSpot(虚拟机中的一种)中使用XSS可以设置栈的深度,如果扩展时无法请求到足够的内存就会抛出OutOfMemoryError(堆内存溢出)。

本地方法栈

本地方法栈和虚拟机栈相似,但是他们还是有些区别的,区别就是:
虚拟机为虚拟机栈执行Java服务(字节码服务),而本地方法栈为虚拟机使用到的Native方法服务。本地方法栈中使用的语言,使用方式,数据结构没有强制要求。

堆是JVM所管理的最大的一块内存空间,他的作用主要用于存放各种类的实例对象。堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,就像我们的磁盘空间一样。

方法区

方法区是一种规范,不同的虚拟机的实现也不一样。从 JDK 1.8 开始,元空间(Metaspace)取代了永久代(PermGen)成为 HotSpot VM 对方法区的实现。方法区存储加载进来的每一个类的结构信息,可以看做是将类(Class)的模板信息,保存在方法区里