jvm 学习记录(1)- 运行时数据区域

本贴最后更新于 2205 天前,其中的信息可能已经事过境迁

概述

程序计数器

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

java 虚拟机栈

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

本地方法栈

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

java 堆

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

方法区

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

运行时常量池

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

直接内存

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

图解

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3165 引用 • 8206 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 3 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...