• 图解JVM内存区域划分


    图解JVM类加载机制和双亲委派模型一文中讲述了 Java 类加载的过程,它包含加载、验证、准备、解析、初始化、使用、卸载这 7 个步骤。在准备阶段,JVM会将类加载到内存中,为类变量分配内存并赋予初值;在初始化阶段则会正式执行初始化代码。

    那么在准备阶段和初始化阶段,JVM 具体是怎么为类分配内存的呢?

    JVM类加载过程

    JVM 把字节码文件加载进来之后放在哪里?代码运行的时候,方法和局部变量放在哪里?创建的对象又该放在哪里?

    内存区域主要划分为哪几块区域?

    • 方法区/Metaspace:JVM加载进来的字节码文件会保存在方法区,Java8之后被称为Metaspace,里面保存类的基本信息。
    • 字节码执行引擎:JVM 加载的字节码文件由字节码执行引擎来执行。
    • 程序计数器:字节码是一行行的CPU指令,由CPU逐行执行,执行到哪一行了,就是由程序计数器来记录
    • 栈内存:Java是多线程的,Java代码是由线程来执行的,每个线程都有各自的调用栈。执行方法时,栈帧进入调用栈,栈帧中有局部变量、方法返回值等信息。
    • 堆内存:堆中保存Java创建的对象,栈中的局部变量可以持有堆中对象的引用。

    JVM内存区域划分

    最后我把整个过程串联一下:

    1. 有两个类,在使用时由JVM的类加载器进行加载,进入到方法区
    2. 由字节码执行引擎执行字节码文件
    3. Java是多线程的,可以启动多个线程执行代码,每个线程都有自己的栈内存
    4. 执行方法,栈帧入栈,方法执行完成,栈帧出栈。栈帧中保存着局部变量、返回值等信息。
    5. 执行初始化操作时,会创建对象,对象保存在堆内存中,变量持有对象的引用。
  • 相关阅读:
    在DataGrid中创建一个点击列名时的弹出式窗口
    利用自定义事件实现不同窗体间的通讯 C#篇
    用javascript实现禁用鼠标右键
    刷新页面时,防止滚动条上滚
    web服务编程
    数据库链接Connection和DataReader的关闭
    .NET的WEB商业应用架构所要解决的若干
    zblog屏蔽分类文章
    过年随想
    mysql数据库文件的真实的物理存储位置
  • 原文地址:https://www.cnblogs.com/shuiyj/p/13185066.html
Copyright © 2020-2023  润新知