运行时数据区域
线程共享的数据区:Method Area (方法区) ; Heap(堆) ; 直接内存
线程隔离的数据区:VM Stack(虚拟机栈) ; Native Method Stack (本地方法栈) ; Program Counter Register (程序计数器)
程序计数器: 多线程线程切换并分配处理器,在任何一个确定的时刻,一个处理器都只会执行一条线程中的指令。每条线程有独立的程序计数器,用于线程切换,记录线程的下一条指令,为了线程能恢复到正确的执行位置
VM Stack : java方法执行的内存模型,方法执行的同时都会创建一个栈帧(Stack Frame)。方法的执行对应栈帧在虚拟机的入栈出栈。 栈指的就是java虚拟机中的局部变量表部分。 对这个区域规定了两种异常状态:1.线程请求的栈大于虚拟机所允许的深度,StackOverFlowError 2.如果虚拟机可以动态扩展(也可以固定长度),扩展时无法申请到足够的内存,OutOfMemoryError
Native Method Stack : 是java虚拟机Native方法服务。与VM Stack 类似,也会抛出异常。
Heap(堆):堆内存是Java虚拟机管理的内存中最大的一块,也是所有线程共享的一块内存区域。主要作用是存放对象的实例。
是垃圾收集器的主要区域,因此也被称为GC堆。从内存回收看,分代收集算法;从内存分配看,多个线程私有的分配缓冲区。java heap 可以是物理上的不连续,逻辑上的连续。可以扩展,但是如果在堆中内存没有完成实例分配,并且堆无法扩展时,会抛出 OutOfMemoryError异常。目前常用art虚拟机
分代收集算法:年轻代(EDen,survivor):复制算法。年老代:标记——整理算法。持久代:静态方法和类
方法区:永久代,因为把GC分代收集扩展到方法区,但同时容易造成内存泄漏。1.7以后改为Native memory
对象的创建:1.(堆中内存是绝对规整的)指针碰撞:对同一数据修改,解决:同步或者本地线程分配缓冲
2.(堆中内存并不是规整的)空闲列表