好久没发博客了,干脆把前段时间学习的java虚拟机的学习成果发一下
java虚拟机运行时数据区主要分为五个部分: 方法区、虚拟机栈、本地方法栈、堆内存、程序计数器,大致模型如下图:
如图,黄色代表的是线程共享的区域,蓝色是线程隔离的区域,下面我们依次来解释每个区域大致的作用
程序计数器: 通过计数器的变化来选取下一条需要执行的字节码指令,因为每个线程执行到的字节码指令是不一样的,所以每个线程都有自己的独立的程序计数器,每个线程的计数器互不影响,独立存储,所以他是线程隔离的区域,如果执行的是一个java方法则这个记录的是正在执行的虚拟机字节码指令的地址,如果是Native方法,则这个计数器应该为空,如何理解上面这句话呢,我个人的理解的是 : java字节码指令是需要虚拟机去读取并执行,所以我们需要记录现在执行到第几条,而Native方法是 C/C++ 编写的,并不需要虚拟机去读取他的指令去执行,运行Native方法是等于是在操作系统上运行,当线程切换,操作系统会帮我们记录当前运行到第几条语句,这是我自己的理解,如果有错误的地方欢迎指正
Java虚拟机栈: 和程序计数器一样,也是线程隔离的,它的生命周期和线程一样,因为每个线程的方法调用都是这个线程独有的,虚拟机栈描述的是java方法执行的内存模型,每一个方法调用执行到执行结束都对应的一个栈帧在虚拟机栈中 入栈到出栈的过程,而栈帧又是什么呢,栈帧是用于存储局部变量表和方法出口等信息,而局部变量表存储了编译器可知的各种java基本数据类型和对象的引用
本地方法栈:本地方法栈和虚拟机栈的作用非常相似,只不过虚拟机栈主要是用于java方法的执行,而本地方法栈是用于Native方法的执行
Java堆内存: Java堆内存存储了几乎所有的对象实例,是所有线程所共享的区域,可通过 -Xmx(最大堆的大小) -Xms(最小堆的大小) 设置堆内存的大小
方法区: 也是线程共享的区域,它通常用于存储被虚拟机加载的类型信息、常量、静态变量、即使编译器编译后的代码缓存等数据
以上就是介绍这几个区域的大致作用,如果有写的不好的地方欢迎指正