Java的JVM的内存可分为三个区:堆(heap)、栈(stack)、方法区(method).

每个线程包含一个栈区,栈中只保存方法中(不包括对象中的成员变量)的基础数据类型和自定义对象的引用,对象都存放在堆区中。
每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
栈分为三个部分:基本类型变量区、执行环境上下文、操作指令。

堆区

存储的全部是对象实例,每个对象都包含一个与之对应的class信息(class信息存放在方法区)
jvm只有一个堆区被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身,几乎所有的对象实例和数组都在堆中分配。

方法区

又叫静态块,跟堆一样,被所有的线程共享。它用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

方法区里存的都是类型信息,也就是类的信息,而类的信息又包括以下内容:
类的全限定名(类的全路径名)
类的直接超类的全限定名(如果这个类是Object,则它没有超类)
这个类是类型(类)还是接口
类的访问修饰符,如public、abstract、final等
所有的直接接口全限定名的有序列表(假如它实现了多个接口)
常量池
字段、方法信息、类变量信息(静态变量)装载该类的装载器的引用(classLoader)、类型引用(class)

Java中的成员变量存储在堆中(非static,非final)

参考链接


Zuckjet
437 声望658 粉丝

学如逆水行舟,不进则退。