静·夜

zido

69 篇文章

zido的个人博客

前后端全栈分享,java/js/golang

概述

程序计数器

当前线程所执行的字节码的行号指示器(看作)。java 虚拟机的多线程就是通过线程乱流切换并分配处理器执行时间的方式来实现的。为了线程在切换后能恢复到正确的执行位置,每条线程都需要独立的程序计数器,各条线程之间计数器互不影响,独立存储。线程私有

java 虚拟机栈

线程私有。生命周期与线程相同,描述 java 执行的内存模型,每个方法执行都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口。方法调用与完成对应栈的入栈和出栈操作。局部变量表(java 程序员常说的堆栈中的栈)存放基本数据类型对象引用,returnAddress 类型(指向一条字节码指令的地址)。其中 long 和 double 占两个局部变量空间,其他占一个。局部变量表大小会在编译时确定,不能更改。线程请求的栈深度大于虚拟机所允许的最大深度时抛出 StackOverflowError。虚拟机栈扩展时无法申请到足够的内存会抛出 OutOfMemeryError。

本地方法栈

为 Native 方法服务,与虚拟机栈抛异常方式一致。

java 堆

虚拟机所管理的最大内存,线程共享,虚拟机创建时创建。存放对象实例(并不一定,栈上分配和标量替换优化技术会导致可能放在其他地方),GC 堆。gc 采用分代收集算法,粗略划分为新生代和老年代。

方法区

线程共享,存储已被虚拟机加载的类信息,常亮,静态变量,即时编译器编译后的代码。

运行时常量池

存放编译期生成的 Class 中的各种字面值和符号引用。在类加载后存储。具备动态性。例如:String.intern()方法。

直接内存

不受堆大小限制。堆外内存。

图解