Java内存模型
一、Java中的内存分配:
【*】具体划分为5个内存空间:
1、栈:存放局部变量
2、堆:存放所有new出来的东西
3、方法区:被虚拟机加载的类信息、常量、静态常量等。
4、程序计数器(和系统相关)
5、本地方法栈
【*】 所有线程共享数据区 (共享) 方法区、堆(Heap)
线程隔离数据区 (独有) 栈、程序计数器、本地方法栈
1、程序计数器:
* 每个线程拥有一个PC寄存器
* 在线程创建时创建
指向下一条指令的地址
执行本地方法时,PC的值为undefined
2、方法区:
保存装载的类信息
类型的常量池
字段,方法信息
方法字节码
通常和永久区(Perm)关联在一起
3、堆内存:
和程序开发密切相关
应用系统对象都保存在Java堆中
* 所有线程共享Java堆
对分代GC来说,堆也是分代的
* GC管理的主要区域
现在的GC基本都采用分代收集算法
堆空间:eden-s0-s1-tenured
【*】 4、栈内存:
【*】 线程私有,生命周期和线程相同
【*】 栈由一系列帧组成(因此Java栈也叫做帧栈),帧保存一个方法的局部变量、操作数栈、常量池指针
每一次方法调用创建一个帧,并压栈
【解释】 每个方法被调用的时候都会创建一个栈帧,用于存储局部变量表、操作栈、动态链接、方法出口等信息。
每一个方法被调用直至执行完成的过程就对应着一个栈帧在虚拟机中从入栈到出栈的过程
两种异常: (1)线程请求的栈深度太深,超出了虚拟机所允许的深度(无限递归),StackOverFlowError
(2)虚拟机栈可以动态扩展,如果扩展到无法申请足够的内存空间,会出现OOM
二、内存模型:
每一个线程有一个工作内存。工作内存和主存独立。工作内存存放主存中变量的值的拷贝
当数据从主内存复制到工作存储时,必须出现两个动作:第一,由主内存执行的读(read)操作;第二,由工作内存执行的相应的load操作;
当数据从工作内存拷贝到主内存时,也出现两个操作:第一个,由工作内存执行的存储(store)操作;第二,由主内存执行的相应的写(write)操作;每一个操作原子化,执行期间不被中断
三、解释运行和编译运行的概念:
解释运行:
解释执行以解释方式运行字节码
解释执行的意思是:读一句执行一句
编译运行(JIT):
将字节码编译成机器码
直接执行机器码
运行时编译
编译后性能有数量级的提升
编译运行的性能优于解释运行