Java内存区域分析

这里写图片描写叙述

程序计数器

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

虚拟机栈

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

本地方法栈

和虚拟机栈很类似,他们之间的差别是本地方法栈是为虚拟机使用的native方法服务的,而虚拟机栈是为虚拟机运行Java方法服务的.

Java堆

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

方法区

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

运行时常量池

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