关于JVM内存

关于JVM内存

Posted by JiangKun on June 20, 2020

这是一个比较官方的图 JVM 内存模型图

在这里插入图片描述 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:<font color = red > 程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区 </font>

下面详细阐述各数据区所存储的数据类型。 在这里插入图片描述

运行时数据区包括:程序计数器、虚拟机栈、本地方法栈、Java堆、方法区以及方法区中的运行时常量池

1、程序计数器线程私有,是当前线程所执行的字节码的行号指示器,如果线程正执行一个java方法,计数器记录正在执行的虚拟机字节码指令的地址,如果线程正在执行的是Native方法,则计数器值为空;

2、虚拟机栈: 即栈区, 线程私有 ,为虚拟机执行 Java 方法(字节码)服务,每个方法在执行的时会创建一个栈帧用于存放局部变量表、操作数栈、动态链接和方法出口等信息,每个方法的调用直至执行完成对应于栈帧的入栈和出栈;

3、本地方法栈: 为虚拟机使用的 Native 方法服务,也是 线程私有

4、Java 堆: 在虚拟机启动时创建, 线程共享 ,唯一目的是存放对象实例,是垃圾收集器管理的主要区域——” GC 堆“,可以细分为新生代和老年代,新生代又可以细分为 Eden 空间、 From Survivor 空间和 To Survivor 空间;物理上可以不连续,但逻辑上连续,可以选择固定大小或者扩展;

5、方法区线程共享 ,用于存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。被称为“永久代”,是因为 H otSpot 虚拟机的设计团队把 GC 分代收集扩展到方法区,即使用永久代来实现方法区,像 GC 管理 Java 堆一样管理方法区,从而省去专门为方法区编写内存管理代码,内存回收目标是针对常量池的回收和堆类型的卸载;

6、运行时常量池线程共享 ,是方法区的一部分, C lass 文件中存放编译期生成的各种字面量和符号引用,类加载后进入方法区的运行时常量池中。 答案就是C错,方法区应该是线程共享的。

再画一个比较简单的图 在这里插入图片描述 变量有几个数据特征:

  • 1.类型
    1. 基本数据类型 byte / short / int / long / float / double / boolean / char

    2. 引用数据类型 class / interface / array

  • 2.成员变量

    局部变量 / 对象的属性 / 类的静态属性

变量的类型特征不能决定变量保存在哪个内存区域中

   
局部变量 栈帧@栈
对象的属性 对象@堆
类的静态属性 类@方法区