java的内存区域划分

简介

Java虚拟机将它所管理的内存分为几个区域。有的区域随着虚拟机的启动而创建;有的区域随着线程的启动而创建,随着线程的停止而销毁。有的区域是同一个Java程序的所有线程共享的,有的区域每个线程私有的。

这些运行时数据区包括:

  • 程序计数器(program counter) — 每个线程私有
  • java虚拟机栈(JVM stack) — 每个线程私有
  • 本地方法栈(native method stack) — 每个线程私有
  • Java堆(heap) — 同一个Java程序的所有线程共享
  • Java方法区(method area) — 同一个Java程序的所有线程共享

程序计数器(program counter)

程序计数器的内容是一条正被执行的指令的地址。
每一个运行着的Java线程,都有自己的程序计数器,它是在线程启动时创建的。每个线程都有自己独立的程序计数器,各个线程之间的程序计数器互不影响。
如果线程正在执行一个Java方法,那么程序计数器保存的是正在执行的虚拟机字节码指令的地址。如果正在执行的是native方法,那么这个计数器的值为空(undefined)。

本地方法栈(native method stack)

本地方法栈是为Java调用native方法使用的,是线程私有的。所谓native方法,是指用Java以外的其它语言编写的方法。

java虚拟机栈(JVM stack)

Java虚拟机栈是线程私有的,周期和线程的生命周期相同。每当一个线程启动时,Java虚拟机都会为该线程分配一个虚拟机栈。
Java虚拟机栈以栈帧(stack frame)为单位保存线程的运行状态,栈帧在虚拟机栈中有出栈、入栈操作。
每当线程调用一个方法时,虚拟机都会在栈中压入一个新的栈帧,这个栈帧就是当前帧。栈帧用于存储方法的参数、局部变量、中间运算结果等数据。
当Java方法返回时,虚拟机会将当前栈帧弹出Java虚拟机栈,并释放掉该栈帧。

Java堆(heap)

在Java虚拟机中,堆是供各线程共享的运行时内存区域,也是供所有类实例和数组对象分配内存的区域。
Java堆在Java虚拟机启动的时候创建,它存储了被垃圾收集器管理的各种对象。
一个Java虚拟机实例只有一个堆空间,被该程序的各线程共享。不同的Java程序运行在不同的Java虚拟机实例上,有着各自的堆空间,因此不同的Java程序互相不干扰。但因为同一个Java程序的所有线程共享同一个堆空间,所以存放在堆空间的数据要考虑多线程访问的同步问题。

Java方法区(method area)

方法区是被同一个Java程序的各线程共享的内存区域,用于存储被虚拟机加载的类的结构信息,例如运行时常量池(runtime constant pool)、静态变量、方法数据、构造函数和普通方法的字节码内容等。
当虚拟机加载某个类型时,使用类加载器定位并读入相应的class文件,虚拟机从中提取类型信息存放到方法区中。

你可能感兴趣的:(java,开发语言,内存)