Java 程序执行过程的内存流程图(结合类加载器 ClassLoader 讲解)

Student s = new Student(); 
s.play();
Student s2 = new Student();

以上代码的执行流程如下:

JVM 作为操作系统的一个迚程在系统中执行,那么系统会为 JVM 分配一块内存空间,这块内存空 间被 JVM 分为 3 大块(栈区、堆区、方法区)

在这里插入图片描述

一般而言,对象在堆(Heap)中创建,但是一些特殊的对象会在方法区中创建。

第一步
当 JVM 执行第一行代码“Student s = new Student();”时
JVM 先碰到了 Student 类,“Student s = new Student();”
此时,JVM 将查看方法区中是否有 Student 对应的 Class 对象(我们学习过反射,都知道 Class
对象,在同一个 JVM 中,可以有很多的 Student 实例,但是 Student 的 Class 对象只有一个)。

因为是第一次执行,方法区中没有 Student 的 Class 对象,此时 JVM 就会调用类加载器 (ClassLoader)

类加载器有 2 大类:
第 1 种是虚拟机本身提供的,第 2 种是程序员自定义的(像 Tomcat 本身也有自己的类加载器)

类加载器(ClassLoader)要加载 Student 类的过程,就是要在物理位置找到 Student 类的字节码文件(如 D:/workspace/web03/classes/Student.class)。
怎么才能找到? JVM 会根据 ClassPath 搜索。

当 JVM 找到 Student 类的字节码文件后,JVM 会将该字节码文件转换为一个 Student 的 Class 对 象,放入方法区

当这个 Student 的 Class 对象构造完毕,类加载过程就完成了。

在这里插入图片描述

第二步

将 Sutdent 类型的变量 s 放入栈(Stack)中; “Student s = new Student();”

在这里插入图片描述

第三步

“Student s = new Student();” 在堆(heap)中创建一个 Student 对象,变量 s 指向该对象。

在这里插入图片描述

第四步

play()方法放在代码区中 Student 的 Class 对象中,对象的方法在 JVM 中只有 1 份,对象的属性(每
个对象都有独有的属性)可以有多份。

执行“s.play();”方法时,Student 对象到方法区中找到 play()方法并执行。

在这里插入图片描述

第五步

执行“Student s2 = new Student();”时,JVM 到方法区中找到了 Student 的 Class 对象,所以 JVM 不再调用 ClassLoader 加载 Class 对象。
将直接在堆中创建。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java javap_javap的用途不断发展:您的Java类文件中隐藏了什么?

java javap什么是Javap,如何使用它以及何时要反汇编类文件? 作为Java开发工具包(JDK)的一部分,我们可以使用许多工具,这些工具有助于更好地理解Java代码。 这些工具之一是javap命令,它使我们能…

虚拟内存越大越好吗_手机的运行内存真的是越大越好吗?6GB和8GB到底又该如何选择?...

许多人买手机,除了看处理器、外观以外,关注最多的莫过于手机的运行内存了。选择一个合适的运行内存几乎关系到整个手机使用寿命和命脉。那么我们现在买手机选择多大的运行内存合适呢?真的是越大越好吗?下面我们就来一起看看吧。选…

Adobe PhotoShop(PS) for Windows 快捷键/PS快捷键

文章目录一、工具栏二、文件操作三、选择功能四、视图操作五、编辑操作六、图像调整七、图层操作一、工具栏 功能说明快捷键备注移动工具V矩形、椭圆选框工具M套索、多边形套索、磁性套索L快速选择工具、魔棒工具W裁剪、透视裁剪、切片、切片选择工具C吸管、颜色取样器、标尺、…

kafka和storm集成_Storm和Kafka集成的重要生产错误和修复

kafka和storm集成我将在此处描述Storm和Kafka集成模块的一些细节,一些您应该意识到的重要错误以及如何克服其中的一些错误(尤其是对于生产安装)。 我在生产安装中大量使用Apache Storm,并将Kafka作为主要输入源(Spout…

显微镜自动聚焦原理是什么_什么是共聚焦显微镜?你了解过共聚焦显微镜吗?...

更出色的表面分析ZEISS Smartproof 5产品表面粗糙度质量控制ZEISS Smartproof 5是一款集成式转盘共聚焦显微镜,依托孔径关联技术将传统共聚焦显微镜的高分辨率与转盘系统的高速采集相结合,能够高速、准确地采集表面3D数据。二维测量:距离、高…

java string args_java – 语法“final String … args”是什么意思/做什么?

Java中参数的省略号表示类型的vararg.因此,在您的情况下,…意味着您可以将任意数量的String参数传递给doInBackground方法.因此,您可以调用此方法doInBackground(“String1”,“String2”,“String3”)或doInBackground(“String1”)或doInBackground(“String1”,“String3”,…

Java 程序执行过程的内存流程图(手写稿)

操作系统会分配一定的内存空间给JVM,空间大小可以在JVM里面设置,JVM会将内存分为三个区域:栈、堆、方法区。

unsafe jdk9_JDK 9清单:Project Jigsaw,sun.misc.Unsafe,G1,REPL等

unsafe jdk9Java 9距离(希望)数月了,现在该回顾一下即将发生的变化以及您应该采取的措施 Java 9即将来临(我们正在计算到达的日子 ),其中包含一系列新功能和改进功能。 这就是为什么我们决定创建一份清单来…

DAO 学习笔记

文章目录什么是 DAO?如何写 DAO?示例代码什么是 DAO? Data Access Object(DAO),数据访问对象/数据存取对象。DAO 是封装数据库访问逻辑的组件/类 。 定义一个类,这个类中的方法封装了数据库访问逻辑,要访问数据库时,只要调用…

dc/os_DC / OS中具有Java和数据库应用程序的服务发现

dc/os该博客将展示一个简单的Java应用程序如何使用DC / OS中的服务发现与数据库进行对话。 为什么要进行服务发现? 应用程序通常由多个组件组成,例如应用程序服务器,数据库,Web服务器,缓存和消息传递服务器。 通常&am…

python进阶项目设计_Python进阶循环设计

之前在“循环”一节,我们已经讨论了Python最基本的循环语法。这一节,我们将接触更加灵活的循环方式。1. 利用range(), 得到下标在Python中,for循环后的in跟随一个序列的话,循环每次使用的序列元素,而不是序列的下标。之…

python调试器入门教程_PyCharm入门第一步(二)——调试第一个Python应用|python基础教程|python入门|python教程...

https://www.xin3721.com/eschool/pythonxin3721/第2步:调试您的第一个Python应用程序找出问题的根源PyCharm报告运行时错误:a ZeroDivisionError。深入研究一下代码,找出问题所在。这里可以使用PyCharm调试器来查看代码中发生了什么。要开始…

Struts2请求处理的内部流程图/结构图/原理图(版本二)

文章目录请求处理流程图流程说明请求处理流程图 流程说明 第 1 步: 客户端初始化一个指向 Servlet 容器(例如 Tomcat)的请求,例如:在浏览器中输入 http:localhost:8080/Struts2/helloworld/helloworldAction.action …

jboss 配置上下文路径_为单个Web应用程序配置多个上下文根– JBoss

jboss 配置上下文路径有时&#xff0c;我们通过在jboss-web.xm l中定义一个来对应用程序进行更改&#xff0c;以支持利用JBoss功能的多个上下文根&#xff0c;如下所示&#xff1a; webapp / WEB-INF / jboss-web.xml&#xff1a; <?xml version"1.0" encoding…

xampp mysql 查询很慢_如何开启mysql的慢查询机制

1 在mysql中默认是不会开启慢查询日志功能的&#xff0c;我们可以使用show variables like ‘%slow%‘来查看一下。结果如下&#xff1a;参数说明&#xff1a;log_slow_queries表示服务器端是否开启慢查询日志记录功能&#xff0c;slow_query_log表示mysql监测满查询的功能是否…

python3.7打包exe坑_[求助]入坑学习python 需要装pyinstaller打包成exe

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼E:\Python>pyinstaller -F E:\Python\123.py142 INFO: PyInstaller: 3.2.1142 INFO: Python: 3.5.3142 INFO: Platform: Windows-7-6.1.7601-SP1143 INFO: wrote E:\Python\123.spec144 INFO: UPX is not available.146 INFO: E…

uaa 授权_使用UAA OAuth2授权服务器–客户端和资源

uaa 授权在上一篇文章中&#xff0c;我介绍了如何使用Cloud Foundry UAA项目启动OAuth2授权服务器&#xff0c;以及如何使用OAuth2授权代码流程中涉及的一些参与者来填充它。 我在Digital Ocean网站上发现这篇文章在描述OAuth2授权代码流方面做得很好&#xff0c;因此&#xf…

谈谈Java编程中的拦截器与过滤器的区别

拦截器是基于 Java 反射机制的&#xff0c;而过滤器是基于函数回调的。 过滤器依赖于 Servlet 容器&#xff0c;而拦截器不依赖于 Servlet 容器。 拦截器只能对 Action 请求起作用&#xff0c;而过滤器则可以对几乎所有请求起作用。 拦截器可以访问 Action 上下文、值栈里的…

电影推荐系统 python简书_文章推荐系统 | 十四、推荐中心

在前面的文章中&#xff0c;我们实现了召回和排序&#xff0c;接下来将进入推荐逻辑处理阶段&#xff0c;通常称为推荐中心&#xff0c;推荐中心负责接收应用系统的推荐请求&#xff0c;读取召回和排序的结果并进行调整&#xff0c;最后返回给应用系统。推荐中心的调用流程如下…

获取请求的url java_Java获取此次请求URL以及服务器根路径的方法

一、 获取此次请求的URLString requestUrl request.getScheme() //当前链接使用的协议"://" request.getServerName()//服务器地址 ":" request.getServerPort() //端口号 request.getContextPath() //应用名称&#xff0c;如果应用名称为 request.getS…