Java的内存结构概述

Java 的内存结构包含了以下几个部分:

程序计数器(Program Counter Register)
Java 虚拟机栈(Java Virtual Machine Stacks)
本地方法栈(Native Method Stack)
Java 堆(Java Heap)
方法区(Method Area)
运行时常量池(Runtime Constant Pool)
直接内存(Direct Memory)
其中,程序计数器、Java 虚拟机栈、本地方法栈、Java 堆和方法区组成了 Java 虚拟机的基本结构,是 Java 程序执行的基础。

程序计数器:是一块较小的内存空间,保存当前线程正在执行的 Java 虚拟机字节码指令的地址。如果是 Java 方法,那么计数器记录的是正在执行的虚拟机字节码指令的地址;如果是 Native 方法,那么计数器的值为 Undefined。

Java 虚拟机栈:每个 Java 方法执行的同时会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。Java 虚拟机栈则是由多个栈帧组成的。在 Java 虚拟机栈中,每个栈帧是一个数据结构,保存了一个方法的状态信息。当一个方法被调用时,一个新的栈帧被压入 Java 虚拟机栈,并成为当前的活动栈帧。当该方法调用完成后,该栈帧被弹出并销毁。Java 虚拟机栈的大小可以通过 -Xss 参数进行调整。

本地方法栈:与 Java 虚拟机栈类似,不过它是为 Native 方法服务的。

Java 堆:是 Java 虚拟机管理的内存中最大的一块,被所有线程共享。Java 堆是所有类实例、数组等对象的内存空间,是垃圾收集器进行垃圾回收的主要区域。Java 堆可以分为新生代和老年代。新生代可以分为 Eden 空间和 Survivor 空间。在 JVM 中,Java 堆大小可以通过 -Xms 和 -Xmx 两个参数来控制。

方法区:是各个线程共享的内存区域,用于存储已经被 JVM 加载的类信息、常量、静态变量等数据。在 HotSpot 虚拟机中,方法区被划分为永久代和元空间。

运行时常量池:是方法区的一部分,用于存储字面量和符号引用。在运行时可以动态生成常量,并将其放入运行时常量池中。

直接内存:直接内存不是 JVM 运行时数据,而是程序所在物理机的物理内存。