先来看一下模型图,有标明作者!

JVM不可怕,先来一一解剖

属于线程私有的:

程序计数器:1.当前线程所执行的字节码行号指示器(逻辑) 2.改变计数器的值来选取下一条需要执行的字节码指令;是不是觉得很复杂?其实就是通过程序计数器来保存线程上下文切换的时候所执行的字节码行号, 确保线程上下文切换的时候有保存所执行的第几行字节码的记录,切换回来还能在上次运行的行号继续运行下去;

虚拟机栈Stack:主要保存java方法执行的内存模型,包含了多个栈帧,其中有1.局部变量表:包含方法执行过程中的所有变量, 2.操作数栈:入栈、出栈、复制、交换、产生消费变量

本地方法栈:与虚拟机栈相似,主要用于标注了native的方法

属于线程共享的:

MetaSpace:内存空间直接使用的是等级内存

堆Heap:1.对象实例的分配区域 2.GC管理的主要区域

调节JVM的堆大小参数

-Xss:规定了每个线程虚拟机栈(堆栈)的大小

-Xms:堆的初始值

-Xmx:堆能达到的最大值

JAVA内存模型中堆和栈的区别

1.管理方式:栈自动释放,堆需要GC

2.空间大小:栈比堆小

3.碎片相关:栈产生的碎片远小于堆

4.分配方式:栈支持静态和动态分配,而堆仅支持动态分配

5.效率:栈的效率比堆高

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐