一个实例了解JVM运行原理

embedded/2024/9/23 20:43:25/

下面以一个具体的代码示例,来说明Java代码对象是如何分配的,Java代码又是如何在JVM中运行的。

public class JVMCase {// 常量public final static String MAN_SEX_TYPE = "man";// 静态变量public static String WOMAN_SEX_TYPE = "woman";public static void main(String[] args) {Student stu = new Student();stu.setName("nick");stu.setSexType(MAN_SEX_TYPE);stu.setAge(20);JVMCase jvmcase = new JVMCase();// 调用静态方法print(stu);// 调用非静态方法jvmcase.sayHello(stu);}// 常规静态方法public static void print(Student stu) {System.out.println("name: " + stu.getName() + "; sex:" + stu.getSexType() + "; age:" + stu.getAge()); }// 非静态方法public void sayHello(Student stu) {System.out.println(stu.getName() + "say: hello"); }
}class Student{String name;String sexType;int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSexType() {return sexType;}public void setSexType(String sexType) {this.sexType = sexType;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

当我们通过Java运行以上代码时,JVM的整个处理过程如下:

1.JVM向操作系统申请内存,JVM第一步就是通过配置参数或者默认配置参数向操作系统申请内存空间,根据内存大小找到具体的内存分配表,然后把内存段的起始地址和终止地址分配给JVM,接下来JVM就进行内部分配。

2.JVM获得内存空间后,会根据配置参数分配堆、栈以及方法区的内存大小。

3.class文件加载、验证、准备以及解析,其中准备阶段会为类的静态变量分配内存,初始化为系统的初始值。

class加载

4.完成上一个步骤后,将会进行最后一个初始化阶段。在这个阶段中,JVM首先会执行构造器方法,编译器会在.java 文件被编译成.class 文件时,收集所有类的初始化代码,包括静态变量赋值语句、静态代码块、静态方法,收集在一起成为<clinit>()方法。
类初始化

5.执行方法。启动main线程,执行main方法,开始执行第一行代码。此时堆内存中会创建一个student对象,对象引用student就存放在栈中。

创建对象

6.此时再次创建一个JVMCase对象,调用sayHello非静态方法,sayHello方法属于对象JVMCase,此时sayHello方法入栈,并通过栈中的student引用调用堆中的Student对象;之后,调用静态方法print,print静态方法属于JVMCase类,是从静态方法中获取,之后放入到栈中,也是通过student引用调用堆中的student对象。

执行方法


http://www.ppmy.cn/embedded/3572.html

相关文章

如何防范XSS?

XSS&#xff08;跨站脚本攻击&#xff09;通常通过注入恶意脚本到其他用户的浏览器中来实现。为了防范XSS&#xff0c;您可以采取以下措施&#xff1a; 输入验证&#xff1a;对所有用户输入进行验证&#xff0c;确保其内容符合预期的格式和类型。例如&#xff0c;如果您正在构建…

Linux程序调试优化(1)——内存占用详解及优化思路

文章目录 1.free查看总体的内存占用2./proc/$PID/status 查看某进程状态 linux开发最重要的两个参数&#xff0c;分别是内存以及CPU使用率&#xff0c;若内存出现严重不足&#xff0c;则在需要使用内存时&#xff0c;可能出现申请不到的情况&#xff0c;导致 OOM&#xff0c;L…

QT跨平台读写Excel

QT跨平台读写Excel 背景Excel工具CMakeLists.txt工程目录 背景 开发框架QT&#xff0c;makefile构建工具CMake&#xff0c;编译器MinGW Excel工具 考虑跨平台则不能使用针对微软COM组件的QAxObject来读写Excel&#xff0c;因此使用开源QtXlsx。 这里是将QXlsx当做源码嵌入使…

iOS最新外部符号加载

介绍 iOS外部符号加载方式有两种&#xff1a;懒加载和非懒加载。 懒加载&#xff1a;首次调用该符号才加载。 非懒加载&#xff1a;app启动时加载。 非懒加载 默认加载方式。比如下面的代码&#xff0c;外部符号调用会先替换成一个桩函数&#xff0c;在__TEXT,__stubs段会…

储蓄比特币:4年复合年化增长率72%

原创 | 刘教链 要说这大多数的散户&#xff0c;甚至包括一些机构&#xff0c;都是追涨杀跌来着。这一点从现货比特币ETF的流入数据就能看到一二。这几日BTC&#xff08;比特币&#xff09;接连下挫&#xff0c;短短10天工夫&#xff0c;就从72k速降1万刀至62k&#xff0c;并一度…

盲人安全导航技巧:科技赋能让出行更自如

作为一名资深记者&#xff0c;长期关注并报道无障碍领域的发展动态。今日&#xff0c;我将聚焦盲人安全导航技巧&#xff0c;探讨这一主题下科技如何赋能视障人士实现更为安全、独立的出行。一款融合了实时避障、拍照识别物体及场景功能的盲人出行辅助应用叫做蝙蝠避障&#xf…

广播变量在spark中的用法以及数据倾斜问题的解决方法

1. spark中的广播变量 应用场景&#xff1a;广播变量用于在集群的各个节点的executor 中高效的分发一个只读的变量副本 操作原理&#xff1a;创建一个广播变量时&#xff0c;spark会将变量序列化并发送到每一个executor&#xff0c;每一个executor存一个副本&#xff0c;而不需…

使用 Docker 部署 instantbox 轻量级 Linux 系统

1&#xff09;instantbox 介绍 GitHub&#xff1a;https://github.com/instantbox/instantbox instantbox 是一款非常实用的项目&#xff0c;它能够让你在几秒内启动一个主流的 Linux 系统&#xff0c;随起随用&#xff0c;支持 Ubuntu&#xff0c;CentOS&#xff0c; Arch Li…