Java虚拟机内存的数据区域

在这里插入图片描述
JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)

栈区:
1、每个线程包含一个栈区,栈中只保存方法(不包括对象的成员变量)中的基础数据类型和自定义对象的引用(不是对象),对象都存放在堆区中
2、每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3、栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
堆区:
存储的全部是对象实例,每个对象都包含一个与之对应的class的信息(class信息存放在方法区)。
jvm只有一个堆区(heap),被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身,几乎所有的对象实例和数组都在堆中分配。
方法区:
又叫静态区,跟堆一样,被所有的线程共享。它用于存储已经被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据。

在这里插入图片描述
由此图可以看出
线程共享的数据区有 方法区和堆。
线程隔离的数据区有 虚拟机栈、本地方法栈和程序计数器。

理解如下:
程序计数器:就是指示当前线程执行的字节码执行到哪了 (当前线程所执行的字节码的行号指示器 )
因为是线程私有的,所以每个线程都是有这样一个指示器的,字节码解释器就是按照这个指示器决定下一步执行哪条字节码

虚拟机栈:就是我们常说的"堆"/"栈"中的 栈,虚拟机栈包含局部变量表,存放数据类型和对象引用(局部变量表所需的内存空间在编译期间完成分配 )

本地方法栈:本地方法栈为虚拟机使用到的Native方法服务

下面是线程共享的区域
java堆:存放对象实例以及数组
Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC堆”

从内存回收的角度来看可以分为:新生代和老年代
从内存分配的角度来看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区

方法区:存储已被虚拟机加载的类信息、 常量、 静态变量、 即时编译器编译后的代码等数据
也被称为永久代,Java虚拟机规范把方法区描述为堆的一个逻辑部分
运行时常量池(Runtime Constant Pool)是方法区的一部分用于存放编译期生成的各种字面量和符号引用。

虚拟机对象概述

发布了59 篇原创文章 · 获赞 111 · 访问量 6240

猜你喜欢

转载自blog.csdn.net/qq_37717494/article/details/104979218