JAVA的堆栈、堆、方法区、常量池

Java 1508℃

Java 虚拟机JVM将运行时内存区域划分为五个部分:方法区、堆、PC 寄存器、Java 方法栈和本地方法栈。

堆区(heap):

  • 提供所有类实例和数组对象存储区域
  • jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身

栈区(stack):

  • 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
  • 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。

方法区(method):

  • 又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
  • 方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

常量池:

  • 常量池(constant pool)又称“永久代”,指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括关于类、方法、接口中的常量,也包括字符串直接量。
  • 在JDK1.6的时候,放在方法区中。到了JDK1.7,转移到了堆区。到JDK8时取而代之的是元空间。

例子:

public void test(){
    A a = new A();
    int b = 1;
}
public class A{
}
//a是A对象的引用所以放在栈中,A是自定义对象所以放在堆中.
//b是基础数据类型所以在栈中.

转载请注明:零五宝典 » JAVA的堆栈、堆、方法区、常量池