Java虚拟机内存划分详解

  1. 程序计数器(PC寄存器):当前线程所执行的字节码行号指示器。线程私有,生命周期与线程相同,每创建一个线程就会创建出一个程序计数器。线程销毁,计数器就销毁。
  2. 本地方法栈:很多方法的实现,都被java封装到了本地方法中,可以直接调用,本地方法栈就是用来存放这些方法的。
  3. 虚拟机栈:线程私有,在创建线程时创建,用来存储栈帧。是Java方法执行的内存模型。每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
    比如执行一个类(类中有main方法)时,执行到main方法,就会为main方法创建一个栈帧,然后加到虚拟机栈中,栈帧中会存放这main方法中的各种局部变量,对象引用等东西。如图
    Java虚拟机内存划分详解
    当在main方法中调用另一个方法时,就会有另一个方法的栈帧入虚拟机栈,当该方法调用完了之后,弹栈,然后main方法处于栈顶,就继续执行,可能经历很多个栈帧的入栈出栈,直到main方法栈帧也弹栈,程序就结束了。

分割线以上线程不共享,分割线以下线程共享。


  1. :所有线程共享的一块内存区域。Java虚拟机所管理的内存中最大的一块,因为该内存区域主要用来存放对象实例。同时堆也是垃圾收集器管理的主要区域,因此很多时候被称为"GC堆",虚拟机栈中存放的引用变量所指向的对象都在堆中存放。
  2. 方法区:和堆一样,是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、和编译器编译后的代码(也就是字节码文件.class)等数据。方法区中还有一个运行时常量池,为什么叫运行时常量池,因为在编译后期生成的是各种字面量和符号引用,这些是存放在一个叫做常量池表(这个常量池表是在字节码文件中)的地方,当类加载进入方法区时,就会把该常量池表中的内容放入运行时常量池中。
    注意
    1 JDK1.7之前运行时常量池包含字符串常量池,存放在方法区;
    2 JDK1.7以后字符串常量池从方法区移到了堆中,运行时常量池还在方法区。

相关文章: