简介
为什么取这个标题呢,因为jvm体系结构这个知识点是狂神视频上这么叫的,为什么括号jvm内存区域呢,因为深入理解jvm这本上这个知识点这么叫。
那么就来和大家先基础的谈谈这个内存区域
从宏观上,把JVM分为了5大模块,比较丰富的内容就是,运行时数据区,这里又分为五个区,这个五个区呢又被划分为,线程共享,和没有线程共享,堆是线程共享的,方法区是特殊的堆,栈是数据共享的,记着有本地方法栈,那么就有两个内容,本地方法接口,和本地方法库,垃圾回收在堆,那么jvm的调优也就基本在堆。
为什么调优不在栈呢?
狂神和这篇参考博客 里面有说,栈里面的用完就弹出了,不会存留,不然main放不就堵塞了嘛
- 类装载器子系统
- 运行时数据区
- 执行引擎
- 本地方法接口
- 垃圾收集模块
看图说话
各位可以自己画一遍,蓝色的部分是所有线程共享的数据,黄色部分线程隔离区域
看书概括
那么我们就来依次介绍(这个内容来自书本,看完过后自己的一些概括)
1、程序计数器:
通过名字我们就知道这是一个计数器,他在内存区域中只占很小一部分,他是当前线程中字节码文件中的行号指示器(感觉就是记录运行到那来了)字节码解释器工作时就是就是改变它的数值选取下一条要执行的命令
每个线程就都一个自己的程序计算器,他们之间互不影响,这样保证了线程每次切换回来的时候,能够恢复到正确的执行位置,所以独立存储,不具备线程共享。
如果执行的是一个java方法他的值是记录虚拟机字节码指令地址,如果是一个本地方法这个值为空
2、Java虚拟机栈(java栈)
描述的java方法执行的线程内存模型,是线程私有的,它的生命周期与线程相同
书中提到,每当一个方法调用,就会在栈中创建一个栈帧,这个栈帧存储的信息如图所示,正在被调用的方法是在栈顶的,一个方法被调用到执行完毕就意味着一个栈帧在栈中的入栈出栈。局部变量表中存储着基本数据类型,但是不同等于对象本身,存的是地址,
栈帧:是方法运行时期一种摘要数据结构
3、本地方法栈
和虚拟机栈一样,只不过执行的方法是本地方法。
4、堆
是虚拟机中管理的最大一块内存,被所有线程共享,此内存区域唯一的目的及其作用就是存放几乎所有的对象实例以及数组
5、方法区
和java堆一样,是被所有线程共享的区域,他用来存储已经被虚拟机加载的类信息(class) ,常量,静态变量,即时编译器编译后的代码缓存等数据,在java虚拟机中常被描述为堆的一个逻辑部分,也叫非堆,用来和堆区分