JVM(Java virtual machine)java 虚拟机是java程序运行的基础。对于日常的开发工作来说,jvm是基本不用管的,程序只要编译没有问题就可以正常运行了。之前做web开发的时候,应用部署在两个tomcat中,当时还认为这两个tomcat运行在同一个jvm上。后来才认识到每个tomcat都运行在自己的jvm上,两个tomcat运行在两个jvm上,可以分别对这两个jvm进行调优。
jvm对于日常的开发,像一个黑盒,里面的东西基本接触不到。如果想要学习jvm,要从哪边下手比较好呢?个人觉得先弄清楚,jvm是由哪几部分组成,每个部分有什么用是个比较实用的方法。弄清楚了这个,就好比出门有了地图,对于周围的环境有了一个整体的认识,不容易迷路了。
那么怎么弄清楚jvm有哪几部分组成呢?当然网上有很多资料,有很多的博客文章,互相验证着看也是一个好方法。但是java最近版本更新的很快,现在最新的版本已经是jdk 14了,jvm是不是也有一些变化更新呢,有没有一份比较权威官方的资料呢?答案是有的。由oracle官方出品的java语言和虚拟机规范是这方面最权威的官方文档了。官网提供了html和pdf两种格式,需要的同学戳 这里。
下图是根据java SE 14虚拟机规范,和网上的博客文章,结合自己的理解所画。
如图蓝色填充所示,JVM可以分为3大部分:类加载器,运行时数据区和执行引擎。
类加载器负责加载字节码文件,即java编译后的 .class 文件。
运行时数据区负责存放.class 文件,分配内存。运行时数据区又分为5个部分:方法区:负责存放.class 文件,方法区里有一块区域是运行时常量池,用来存放程序的常量。
堆:分配给对象的内存空间。
方法区和堆是所有线程共享的内存空间。java虚拟机栈:每个线程独享的内存空间。
本地方法栈:本地native 方法独享的内存空间。
程序计数器:记录线程执行的位置,方便线程切换后再次执行。
java虚拟机栈,本地方法栈,程序计数器是每个线程独享的。