java运行时数据区是jvm较为基础的知识,这里画一下自己对这一部分的理解,加深印象
结构图如下:
每个线程独占的资源可以分为虚拟机栈,本地方法栈和程序计数器,而堆和方法区是所有线程之间共享的,直接内存不属于jvm管理,但是我们的java代码仍然可以使用,故也在图上做了展示。
方法区:class加载到内存中位置,保存了class相关信息,内存有个常量池,静态变量(static),常量(final)也会加载到这里,方法区在不同版本的jdk实现不同,jdk7实现在永久代,jdk8实现在元空间。
堆:是我们new对象的主要场所,采用的分带划分??梢苑治猠den区,s0和s1区,老年代。为何这么设计,主要是GC算法的设计,这里不做深入探讨。
虚拟机栈:每个方法以栈桢的形式进入,是一个先入后出的数据结构,里面可以分为局部变量表(保存局部变量和计算中间产生的变量),操作数栈(进行数据计算的一个栈结构),动态链接(在运行时确定方法的具体调用)和方法返回(方法返回地址)。
本地方法栈:native方法的栈结构,hotspot将本地方法栈和虚拟机合二为一。
程序计数器:这里保存线程中方法执行到的到具体行号。