JVM内存区域

类加载

将class文件加载到方法区中
在这里插入图片描述
验证:验证待加载的class文件是否正确,比如验证文件的格式
准备:为static变量分配内存并赋零值
解析:将符号引用解析为直接引用

类加载器

双亲委派

士兵的流程图太形象了
总结就是,向上查找有没有加载过,再向下确定要不要加载
作用:

  • 保证类的唯一性,防止重复加载
  • 防止恶意类的加载

运行时数据区

Java虚拟机运行程序的过程中,会将管理的内存分成若干不同的数据区域。以JDK1.8为例:
在这里插入图片描述

虚拟机栈

线程私有,随着线程的创建而创建,线程死亡则栈也死亡。结构如图:
在这里插入图片描述
每一个方法调用,都有一个栈帧压入栈中;方法结束,则栈帧被弹出。
所以栈帧主要存储方法相关的内容。

局部变量表 & 操作数栈
    public static void main(String[] args) {
        int a = 1;
        int b = 2;
        int c = a + b;
    }

代码的计算过程,在局部变量表中,存储a、b各自的值,再将两者的值压入到操作数栈里面。
执行加法的实际行为,就是在操作数栈顶层的两个数字相加得到一个结果,再将结果存入局部变量表的c中。

局部变量表
在这里插入图片描述

操作数栈
在这里插入图片描述

动态链接

当A方法调用B方法时,用于找到B方法的地址

返回地址

方法调用结束后应该回到哪个地方

栈可能出现的错误

虚拟机栈不需要进行垃圾回收,但会出现StackOverflowError和OutOfMemoryError。

  • StackOverError:调用层次过多,每个方法都压入一个栈帧,深度方面
  • OutOfMemory:线程太多,没有足够的内存再创建虚拟机栈了,宽度方面

本地方法栈

类似虚拟机栈,主要用于存储native方法相关信息

程序计数器

  • 一块较小的内存空间
  • 解释器通过改变程序计数器来读取指令,以此来实现流程控制(顺序、条件分支、循环、异常)
  • 多线程情况下,记录当前线程执行的下一条指令位置,便于切换线程后知道再执行哪个地方
  • 唯一一个不会出现OutOfMemoryError的内存区域

用于存放对象实例数组。“new出来的东西都在堆里面

-Xms	指定堆的初始化内存大小
-Xmx	指定堆的最大内存大小

在这里插入图片描述
新生代跟老年代占空间比例:1:2
Eden : S0 : S1 = 8 : 1 : 1

  • 新创建的对象存入Eden区,经过YoungGC依旧存活则进入S0或S1
  • 经过15次GC依旧存活,就转入老年代
  • 如果有Eden区放不下的大对象,可能直接进入老年代

方法区

逻辑存在,是《Java虚拟机规范》规定的概念,不同的虚拟机有不同的实现,比如JDK1.8之前的永久代,1.8之后的元空间。
在这里插入图片描述
方法区用于存储已经被加载过的类相关的信息:类信息、字段信息、方法信息、常量、静态变量、即时编译器编译后的代码缓存等数据

相关推荐

  1. 谈谈JVM内存区域

    2024-04-05 07:16:02       41 阅读
  2. JVM虚拟机内存区域详情

    2024-04-05 07:16:02       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-05 07:16:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-05 07:16:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-05 07:16:02       82 阅读
  4. Python语言-面向对象

    2024-04-05 07:16:02       91 阅读

热门阅读

  1. P1032 字串变换

    2024-04-05 07:16:02       32 阅读
  2. ubi文件系统挂载

    2024-04-05 07:16:02       41 阅读
  3. centos7 安装 nginx

    2024-04-05 07:16:02       30 阅读
  4. fssh挂载远程服务器目录

    2024-04-05 07:16:02       30 阅读
  5. TensorBoard可视化+Confustion Matrix Drawing

    2024-04-05 07:16:02       33 阅读
  6. 归类一些vim的插件,需要时来看

    2024-04-05 07:16:02       37 阅读
  7. 查看Git用户名/密码/邮箱,及设置git配置

    2024-04-05 07:16:02       36 阅读
  8. 阻抗控制中的effort and flow

    2024-04-05 07:16:02       33 阅读
  9. GoPro相机使用的文件格式和频率

    2024-04-05 07:16:02       36 阅读