在java中,堆栈和方法区的原理是它的底层运行机制之一,如果能了解透对我们编写java代码会有非常大的帮助,本篇文章就跟小编来了解下。

栈区

在java中,每个线程都会包含一个栈区,且在栈中它只会保存方法的基础数据类型及自定义对象的引用,栈的内存管理不会存在内存回收问题,但堆会,因为堆是随机分配内容的。

Java中的JVM是基于堆栈的虚拟机,在创建每个新线程时都会分配一个堆栈.就是说,对Java程序而言,它的运行就只是通过一些堆栈操作来完成的。

每当线程执行一个方法时,它就会跟着创建一个对应栈帧,并把建立的栈帧压栈。方法执行完毕后,再把栈帧出栈。

由此我们可知,线程与当前所执行的方法对应的栈帧是必定位于Java栈顶部的。因此对于所有的程序设计语言而言,栈这部分空间对开发者来说是不透明的。

堆区

在java中,堆数据区是用来存放对象和数组的,每个对象都包含一个与之对应的class的信息,堆内存是被多个线程共享的。在JVM启动后堆内存会随之创建。堆中只会存放对象本身,不会存放基本类型和对象引用,几乎所有的对象实例和数组都在堆中分配。

方法区

我们一般也叫静态区,它与堆一样是被所有的线程共享的。方法区用于存储已经被虚拟机加载的常量、静态变量、类信息、即时编译器编译后的代码等数据。

方法区实际上来说是一个各个线程共享的内存区域,就是用来存储已经被虚拟机加载完成的各种即时编译器编译后的代码等一些数据。

内存区存放示意图:

java native堆 与本地方法栈 java堆栈方法区图解_java堆栈方法区