1.方法区(Method Area) 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据java
2.堆(Heap) 存放对象实例,几乎全部对象实例都在这里分配内存数组
3.虚拟机栈(VM Stack) 描述的是Java方法执行的内存模型:每一个方法在执行的同时会建立一个Stack Frame(方法运行时的基础数据结构)用于存储局部变量表、操做数栈、动态链接、方法出口等信息缓存
4.本地方法栈(Native Method Stack) 与虚拟机栈了相似,不过则为虚拟机使用的到的Native方法服务。(有的虚拟机譬如Sun HotSpot虚拟机直接把本地方法栈和虚拟机栈合二为一)数据结构
5.程序计数器(Program Counter Register) 可看做当前线程所执行的字节码的行号的标识器jvm
一、stack segment
二、heap segment
三、code segment
四、data segment)
当咱们在程序中声明一个局部变量的时候,此变量就存放在了 stack segment(栈)当中;优化
当new 一个对象的时候,此对象放在了heap segment(堆)当中;线程
static 的变量或者字符串常量 则存在在 data segment(数据区)中;code
类中方法是存在在 code segment(代码区)中。对象
栈stack内存
堆heap
方法区method area( 位于堆中)
运行时数据区包括:虚拟机栈区,堆区,方法区,本地方法栈,程序计数器
虚拟机栈区 :也就是咱们常说的栈区,线程私有,存放基本类型,对象的引用和 returnAddress ,在编译期间完成分配。
堆区 , JAVA 堆,也称 GC 堆,全部线程共享,存放对象的实例和数组, JAVA 堆是垃圾收集器管理的主要区域。
方法区 :全部线程共享,存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。这个区域的内存回收目标主要是针对常量池的对象的回收和对类型的卸载。
程序计数器 :线程私有,每一个线程都有本身独立的程序计数器,用来指示下一条指令的地址。
Java线程之间的通讯由Java内存模型(简称为JMM)控制,JMM决定一个线程对共享变量的写入什么时候对另外一个线程可见。
一、String str1 = “abc”,“abc”分配在内存字符常量区;
二、程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的;
三、虚拟机栈描述的是Java方法执行的内存模型,用于存储局部变量,操做数栈,动态连接,方法出口等信息,是线程隔离的;
四、原则上讲,全部的对象都在堆区上分配内存,是线程之间共享的