浅谈java虚拟机

JVM

jvm具体英文解释为java虚拟机。但是具体来说,jvm知识规定了虚拟机的规范,是一个理论的定义。

虚拟机常识

各个公司根据jvm规范进行了具体的实现,也就形成了虚拟机的各个版本。
以当下而言,常用的虚拟机版本就是oracle公司的hotspot 以及IBM公司的j9
而在jdk8 未出现的时间,虚拟机主要是三分天下
sun 公司的hotspot
DBE 公司的JRockit
IBM 公司的j9
jdk8以后oracle收购了前两个公司,将两个虚拟机进行了整合

虚拟机内存构造

浅谈java虚拟机_第1张图片
基本包含内容如图所示,其中个体以下具体介绍

  • 程序计数器 用于标记下一运行的程序语句,该内存区域是虚拟机中
    唯一不用担心内存溢出的板块。储存的是虚拟机字节码指令的地址。当执行native方法时间,值为空。
  • java虚拟机栈 用于描述java方法执行的内部模型,每个方法的执行都会创建栈帧,而每个方法的开始调用到执行完成,都对应栈帧在栈中的出入栈过程
  • 本地方法栈 本地方法栈和虚拟机栈非常相似,不过需要执行的方法是native方法
    (由于java的出现是在c/c++如日中天的情况之下,面对当时的情况,java不得不屈服于c,因此,在虚拟机中建立了本地库接口,这里就是用于调用系统中的c/c++方法,而这里的native正是如此,本地方法栈也是运行这一类的方法)
  • java堆 用于存放对象实例,几乎所有的对象实例都在其中存储,java的垃圾回收机制正是用于此处。
  • 方法区 用于存放已被虚拟机加载的类信息、常量、静态变量等信息。通常认为该区域是堆逻辑上一部分,但它也叫Non-Heap。就好比之前的日本和中国的关系。日本是中国的一部分,但是对于台湾而言,他们有部分又不承认是中国的一部分。

栈、堆、方法区图解关系

浅谈java虚拟机_第2张图片
如图所示,栈中保存保存栈帧,也就是对应的方法,对于方法而言,用到的基本类型数据保存到栈中,其他的对象类型,直接使用堆中的引用,而对于引用,又要访问方法区,看方法区中是否有该对象已经保存的数据。

虚拟机栈操作

对于栈而言,相信都知道它的特点-------先进后出。
对于一个线程,每一个线程都有一个栈,用于存放该线程中所要运行的方法,对于每个方法,都会创建一个栈帧,装入相应的信息,放入栈中,当方法运行结束,该栈弹出该方法的栈帧。
可以考虑,对于一个含有main方法的主线程的程序,main方法中调用了其他的方法,这个主线程的栈该如何压入弹出?
结果好似显而易见,首先执行的肯定是main方法,main方法肯定会第一个入栈,之后调用其它方法,再将其他方法入栈,再之后根据结束的先后顺序依次出栈。

有关堆

堆是虚拟机垃圾回收的主角, 堆划分为以下的几个区域
浅谈java虚拟机_第3张图片
在jdk8 之前,元数据空间又称为永久代。
其他具体的有关垃圾回收的算法的思路

你可能感兴趣的:(java)