JVM内存模型

发展:
cpu转速快,磁盘读写速度跟不上,才设计了内存;
cpu发展,内存读写速度远远跟不上,为此cpu上加上了高速缓存(带来缓存一致性问题,需要各个cpu运行遵循一些协议,运行时 保证数据的一致性)。

image

a.多线程就是多条线程并发执行任务;
b.高效的并发编程;
c.多线程共享jvm主存,又各自有自己的工作内存;线程与主存交互,数据由主存拷贝到工作内存,交由线程处理(操作码+操作数)

image

1.程序计数器
a.一块很小的内存空间;
b.当前线程执行字节码文件行号指示器;
c字节码解释器通过改变计数器的值来选取下一条需要执行的字节码值来,分支、循环、跳转、异常处理、线程恢复都需要依赖这个计数器来完成
*java多线程时通过线程轮流切换分配处理器时间的方式实现,一个处理器一个时刻只会处理一条线程中的指令,为了线程切换后能恢复到正确位置,每条线程都一个私有的程序计数器,各个线程计数器互不影响,独立存储,称为"线程私有内存";
java方法:计数器记录的是正在执行的虚拟机字节码指令的地址;
Natvie 方法:唯一Java 虚拟机规范中没有规定任何OutOfMemoryError的区域,计数器值则为空(Undefined)

2.虚拟机栈(JAVA方法)
a.内存模型,栈”就是现在讲的虚拟机栈(虚拟机栈中的局部变量表),Java 方法执行的内存模型;
b.
c.局部变量表存放了编译期可知的各种基本数据类型(long、double占两位局部变量空间slot)、对象引用(引用指针,代表对象的句柄,对象相关的位置)和returnAddress 类型(一条字节码指令的地址);
编译期完成内存分配,在运行时不会改变局部变量表的大小;
栈OutOfMemoryError 两种情况:
1).线程请求的栈深度大于虚拟机所允许的深度;
2).扩展时无法申请到足够的内存
*程序计数器一样,Java 虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同

3、本地方法栈(NATIVE方法)
本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的
本地方法栈区域也会抛出StackOverflowError 和OutOfMemoryError异常

4.Java 堆
a.Java 虚拟机所管理的内存中最大的一块,被所有线程共享的一块内存区域,垃圾收集器管理的主要区域,也被称做“GC 堆”
b.存放对象实例,几乎所有的对象实例都在这里分配内存
*几乎所有的对象实例(所有的对象实例以及数组)都在这里分配内存,JIT 编译器发展与逃逸分析技术成熟,栈上分配、标量替换优化技术使得所有的对象都分配在堆上渐渐不是那么“绝对”;
收集器基本都采用分代收集算法,细分为:新生代和老年代;细致一点的有Eden 空间、From Survivor 空间、To Survivor 空间等;
线程共享的Java 堆中可能划分出多个线程私有的分配缓冲区(Thread LocalAllocation Buffer,TLAB),无论怎么划分都是存储的都是对象实例,进一步划分的目的是为了更好地回收内存,或者更快地分配内存;

你可能感兴趣的:(JVM内存模型)