java内存区域

1.java运行时数据区域分为:

image.png
  • 程序计数器,是当前线程所执行的行号指示器,是线程隔离的,每一个线程都有自己独立的程序计数器,每一个线程的计数器是互不影响,是线程的“私有内存”,是内存区域中唯一一个没有规定的任何outOfMemoryError内存区域;

  • java虚拟机栈,是线程私有的,是java方法执行的内存模型,每个方法执行的时候都会创建一个栈帧,用于存放局部变量表(基础数据类型,对象引用,returnAdress类型),操作栈,动态链接,方法出口等;可能会出现二种异常,第一种是线程请求深度大于虚拟机所允许的深度,会抛出stackoverflowError,第二种虚拟机可以动态扩展时但无法申请到足够多空间时抛出OutofMemoryError异常;

  • 本地方法栈,跟java虚拟机栈差不多,只不过 本地方法栈为虚拟机所用的native方法服务的;

  • java堆,是java虚拟机中所管理最大的一块内存,是所有线程共享的一块区域,是存放实例对象和数组,是一个可以物理上不连续的内存空间,只要逻辑上是连续即可,如果在堆中没有足够的内存完成实例分配,并且堆无法扩展时,会抛出OutofMemoryError异常;

  • 方法区,方法区跟java堆一样,是各个线程共享的内存区域,用于存放已被虚拟机加载的类信息,常量,静态变量,即时编译器后的代码等数据,比较难回收,当方法区无法满足内存分配时,也会抛出OutOfMemoryError异常;

  • 运行时常量池,是方法区的一部分,用于存放编译期生成的各种字变量和符号引用,这部分内容会在类加载后存放在方法区中的运行时常量池;

2.对象的访问

主流的访问方式是:使用句柄和直接指针;

  • 使用句柄方式,java堆中将会划分出一块内存来作为句柄池,reference(存于虚拟机栈)中存储的就是对象的句柄地址,而句柄中包括了对象的实例数据和对象类型数据的各自具体地址信息;
    image.png
  • 直接指针,java堆对象的布局就必须考虑放置访问类型数据的相关信息,reference中存储的就是对象地址;


    image.png

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