Java内存区域分析

Java内存区域分析_第1张图片

程序计数器

  • 指令执行的指示器.
  • 每个线程都有独立的程序计数器,互无影响,我们称这类区域为线程私有的内存.
  • 执行Java方法,计数器记录的是正在执行的虚拟机字节码指令地址;如果执行的是native方法,这个计数器为空.
  • 此内存区域唯一一个没有规定任何OutOfMemoryError的区域.

虚拟机栈

  • Java虚拟机栈也是线程私有的,它的生命周期与线程相同.
  • 虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的时候都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息.
  • 如果线程请求的深度大于虚拟机深度,将抛出StackOverflowError异常;如果虚拟机可以动态扩展,扩展时无法申请到足够的内存,将抛出OutOfMemoryError.

本地方法栈

和虚拟机栈非常相似,他们之间的区别是本地方法栈是为虚拟机使用的native方法服务的,而虚拟机栈是为虚拟机执行Java方法服务的.

Java堆

  • Java堆是虚拟机管理的最大的一块内存.
  • 被所有线程共享的一块区域.
  • 此内存唯一目的是存放对象的实例.
  • 垃圾收集管理主要区域.

方法区

方法区与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据.

运行时常量池

  • 运行是常量池是方法区的一部分.
  • 用于存放编译期生成的各种字面量和符号引用.
  • 运行时常量池和Class文件常量池不一样.Java语言不要求编译时产生Class文件常量才能进入运行时常量池,运行期间也可能将新的常量放入池中.这种特性被开发人员用的多便是String类的intern()方法.

你可能感兴趣的:(java,jvm,内存,区域)