Java的内存区域概述

61 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第44天,点击查看活动详情 >>

Java的内存区域概述

今天我们来学习一下Java的内存区域,来看看Java的内存模型究竟包括了什么,下面我们将针对运行时数据区里面的部分一步一步地讲解。

一、程序计数器

这个程序计数器占用的内存空间是比较小的,相信有学习过操作系统的朋友都知道程序计数器,在Java虚拟机中国,它可以看做是当前线程所执行的字节码的行号指示器。

为了每个线程切换后能恢复到正确的执行位置,每条线程都需要独一份的程序计数器,也就是说程序计数器是线程私有。

二、Java虚拟机栈

栈和程序计数器在线程拥有方面都是一样的,那它们都是线程私有的。

在每个方法被执行时都会同步地在Java虚拟机中创建一个栈帧。(栈帧是用来存储局部变量表、操作栈等信息的)

方法的执行意味着入栈,方法的执行结束就意味着出栈

三、本地方法栈

上面已经说了Java虚拟机栈,Java虚拟机栈是为执行字节码服务,可是这里的本地方法栈是为虚拟机中用到的本地方法服务的。

这里要注意Java方法和本地方法的区别。

四、Java堆

Java堆的空间这里这部分是线程共享(java虚拟机中的每个线程都共享这块内存区域)。

还有一点就是Java的世界的“几乎”所有的对象实例对象都是在堆空间这里分配内存的。

另外的话,Java堆还是垃圾收集器管理的内存区域,又称(GC堆)

五、方法区

方法区和上面所提到的Java堆都是线程共享的,

注意方法区只是Java虚拟机里定义的一个概念模型,并不是具体实现,也就是说在不同虚拟机中可以有不同的实现:

比如:

  1. 永久代实现方法区
  2. 元空间实现方法区

六、运行时常量池

这里所说的运行时常量池其实是方法区中的一部分 ,运行时常量池里面存储着常量池表,而这部分信息是用来存放代码在编译期生成的各种字面量和符号引用(当然啦,运行时常量池还有一个动态特性,也就是说常量不仅仅是编译期加入,也可以是运行时动态加入新的常量)

总结:

这一次我们主要接介绍了java内存模型中的程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、运行时常量池这五部分,其中

程序计数器和虚拟机栈是线程私有的,而Java堆和方法区是线程共享的。