jdk8以前
jdk8以后
内存分出的数据区域:程序计数器,Java 虚拟机栈,本地方法栈,堆,方法区,运行时常量池,字符串常量池。
栈:
局部变量表:存放方法参数和方法内定义的局部变量,包括基本数据类型(byte、short、int、long、float、double、char、boolean )以及对象引用。例如在一个方法中定义 int num = 10; ,这个 num 就存储在局部变量表中。
操作数栈 :方法执行过程中,用于存储操作数和运算结果。比如进行 int a = 1 + 2; 运算时,1 和 2 先压入操作数栈,运算后结果 3 也在操作数栈中暂存。
动态链接:Java 虚拟机栈中每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的符号引用,用于支持方法调用过程中的动态链接。
方法返回地址:当方法执行完成后,需要返回调用它的地方,这个地址就存储在此处。
堆
存储内容:是 Java 虚拟机管理的最大一块内存区域,几乎所有的对象实例和数组都在堆上分配内存。例如使用 new 关键字创建对象,如 Object obj = new Object(); ,这个新创建的 Object 实例就存放在堆中。堆也是垃圾回收器主要管理的区域,会根据对象的存活情况进行垃圾回收,释放不再使用的内存空间。
方法区
类信息:包括类的全限定名、父类信息、接口信息、字段信息、方法信息等。比如定义一个 class Person ,这个类的相关结构信息就存储在方法区。
常量:如静态常量,像 public static final int MAX_VALUE = 100; 中的 MAX_VALUE 就存放在方法区。
静态变量 :类中定义的静态变量,如 public static int count = 0; ,count 存储在方法区。
即时编译器编译后的代码:Java 虚拟机的即时编译器(JIT)会将一些热点代码编译成机器码,编译后的代码存放在方法区。 此外,运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。