JVM虚拟机概述

JVM是Java Virtual Machine(Java虚拟机)的缩写,也就是指的JVM虚拟机,属于是一种虚构出来的计算机,在我们实际的电脑上来进行模拟各种计算机的功能的这么个东西。

在深入理解JVM一书中提到,JVM运行时的数据区域会划分为几个不同的区域,有方法区(Method Area),虚拟机栈(VM Stack),本地方法栈(Native Method Stack),堆(heap),程序计数器(Program Counter Register)如图在这里插入图片描述

  • 程序技术器(Program Counter Register)
    程序计数器实际上就是用于存放下一条指令所在的地址的地方,当我们执行一条指令的时候,需要知道这条指令的位置,然后把指令带到寄存器上就是获取指令,然后程序计数器中的存贮地址会加1,然后这样循环的去执行,而且程序计数器这个小的内存是“线程私有内存”。

程序计数器的特点:

  • 如果程序正在执行的是java方法,则这个计数器记录的是正在执行的虚拟机指令地址。

  • 如果正在执行的是Navite方法,则这个计数器的值为空(undefind)。

  • 此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

  • JAVAX虚拟机栈(VM Stack)
    线程私有,生命周期和线程一样,这个虚拟机栈描述的是JAVA方法执行的内存模型,用于存局部变量,操作数栈,方法出口等信息的,上面那个bipush就是入栈指令,在这里最需要注意的就是他存放的是什么类型,局部变量里面放的就是那些我们所知道的基本数据类型,对象引用的话就是地址值。

栈会引起的两个异常情况:

  • 一个是StackOverflowError异常,栈内存溢出,这肯定容易理解,就是栈的内存不够,你的请求线程太大(固定长度的栈)

  • 如果说出在动态扩展的过程中,申请的长度还是不够,那么会抛出一个OutOfMemoryError异常

  • 本地方法栈(Native Method Stack):
    它和虚拟机栈很类似,区别就在于虚拟机栈执行的是JAVA方法,但是本地方法栈则是Native方法,其他的没啥不同就连抛出异常都一样的

  • JAVA堆(heap)
    堆是在JAVA虚拟机中内存占用最大的一个地方,也就是所有线程共享的一个内存区域,堆内存中主要就是用于存放对象实例的。
    几乎所有的对象实例都在这里分配内存,JAVA堆是垃圾收集器管理的主要区域。

内存回收,现在都是进行分代算法,堆中也是,新生代,老年代,而且两种垃圾回收机制是采用的不同的回收机制。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只要付出少量存活对象的复制成本就可以完成收集。

而老年代中因为对象存活率高,没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-压缩”算法进行回收,说回收机制先看看heap的分区在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43550109/article/details/89380434