1.主要是分为6个区域:
1.栈(Java 虚拟机栈stack):方法【运行时】所进入的区域,里面还会存储程序的局部变量
2.堆(Heap):凡是New出来数据的都会进入堆中
3.方法区(Method Area):字节码文件加载时所进入的内存,用于存储所谓的元(Meta)数据,例如类结构信息,以及对应的字段(如成员属性)、方法代码等,分为静态区和非静态区
4.本地方法区(本地方法栈,Native Method Stack):native修饰的方法都会进入其中,主要是调用的是操作系统的相关资源
5.程序计数器:在 JVM 规范中,每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。
程序计数器会存储当前线程正在执行的 Java 方法的 JVM 指令地址;或者,如果是在执行本地方法,则是未指定值(undefined)
6.运行时常量池(JDK1.7以前在方法区中,从JDK1.7开始,常量池区域是存在于堆中)
如下图的内存结构图(注:此图是JDK1.7以前的版本)
注:Intern 字符串的缓存和静态变量曾经都被分配在永久代上,而永久代已经被元数据区取代。但是,Intern 字符串缓存和静态变量并不是被转移到元数据区,而是直接在堆上分配,所以这一点同样符合前面一点的结论:对象实例都是分配在堆上。
2.不同的数据使用的是哪一块空间
3.类加载顺序
- 首先加载父类的静态字段或者静态语句块
- 子类的静态字段或者静态语句块
- 父类的普通变量以及语句块
- 父类的构造方法被加载
- 子类变量或者语句块被加载
- 子类构造方法被加载