堆,栈,方法区的联系


栈(stack)
Java 里的栈分为 虚拟机栈与本地方法栈,在大家口中经常说的栈,一般是指我们的虚拟机栈

Java 虚拟机栈(后面简称栈)是线程私有的,所以他的生命周期与当前线程是一样的,栈是用来描述方法执行的一个内存模型,因为每个方法在执行的同时,都会创建一个栈帧,而这个栈帧里面,又存储着局部变量表,操作数栈,动态链接,方法出口等一系列信息,下图为一般调用某一个方法时的栈内存图

方法区
方法区也被称为静态区,是线程共享的内存区域,用于存储不如类信息class、常量 final、静态数据 static、以及全局变量等数据;因为方法区是被所有线程共享的,所以必须考虑数据的线程安全问题

方法区又可以分为上图区域

  • 类类型信息:父类名称、类型修饰符、类类型的直接接口
  • 常量池:比如static数据,全局变量,final常量
  • 域信息:域名称、类型、修饰符
  • 方法信息:方法名称、参数、修饰符等
    JDK 1.7之后,String以及不属于方法区常量池了,而是移到了堆区域

堆(heap)
堆是线程共享的区域,即也需要考虑到线程安全的问题,它是虚拟机里面最大的一块内存,这里的内存是用来存放实例化对象,几乎所有的实例化对象和数组都是存在这里,简单的理解就是只要看到 new ,就应该知道 new 出来的那一块内存在堆里面,由于垃圾回收期的原因,堆一般又分为新生代和老年代,而新生代又分为 Eden空间、From Survivor空间和To Survivor,他们的比例大概为8:1:1,而新生代与老年代的比例大概为1:2,为了更好的回收内存或者更快的分配内存,堆又划分出了多个线程私有的分配缓冲区(TLAB),但是无论怎么划分,堆里面还是存放的实例化对象或者数组
由于虚拟机不需要知道堆内存存放的变量信息空间大小是多少,也不需要知道每个对象的声明周期,所以该区域的程序的运行灵活性高,堆还是GC重点回收的区域

三者联系

1、堆:解决数据的存储问题( 即 数据怎么放,放到哪 )。

2、栈:解决程序运行的问题( 即 程序如何执行,或者说如何处理数据 )。

3、方法区:辅助堆栈的一块永久区,解决堆栈信息的产生,是先决条件。

posted @ 2021-11-25 19:08  一刹流云散  阅读(128)  评论(0编辑  收藏  举报