深入浅出JVM —— Java内存结构

Java内存结构

深入浅出JVM —— Java内存结构

  1. 程序计数器: 线程私有,记录当前线程所执行的字节码的行号(执行本地方法时显示的值是Undefined),也就是用来控制程序执行流程的。因为记录的只是一个行号,所以是唯一一个不会发生OOM错误的地方。
  2. 虚拟机栈: 线程私有,用来存放栈帧,线程里调用的每个方法都会形成栈帧(栈帧存储局部变量表、操作数栈、动态链接、方法出口等信息),当栈帧数量超过规定的虚拟机栈深度时,就会发生StackOverflow错误。
  3. 本地方法栈: 线程私有,与虚拟机栈类似,只不过它用于存放native方法形成的栈帧。
  4. 方法区(元空间): 线程共享,存储虚拟机加载的类信息、常量、静态变量等数据。
  5. 堆: 线程共享,存放对象实例,GC发生的重点区域。
  6. 直接内存: 一个有用但常被忽略的地方,不注意的话会因为忽略了它的大小而造成OOM错误。

注意:

  1. Java内存结构和Java内存模型是不一样的。
    Java内存结构:指的是内存的存储结构、组成。
    Java内存模型:是对内存读写过程的抽象,以后有机会再讲。

  2. 深入浅出是为了理清脉络,抓住重点,记录让我灵机一动的点,故而采用了忽略细节、只讲关键的形式。倘若觉得不过瘾,可以去看《深入理解Java虚拟机》进一步深入其中的原理。