建设网站的相关软件,襄阳网站建设公司招聘,石家庄服务大型建站,自己服务器建设网站java内存图java文件运行流程程序的内存空间认识虚拟机栈程序的执行流程认识堆java的类与对象的关系java文件运行流程
有这样的一份 java 文件 在该目录下的终端运行 javac Hello.java 命令#xff0c;会生成 Hello.class 文件#xff0c;内容如下#xff1a; Hello.java 打…
java内存图java文件运行流程程序的内存空间认识虚拟机栈程序的执行流程认识堆java的类与对象的关系java文件运行流程
有这样的一份 java 文件 在该目录下的终端运行 javac Hello.java 命令会生成 Hello.class 文件内容如下 Hello.java 打开是我们能够看懂的代码也叫源代码文件源代码文件是给咱们程序员去看的而 Hello.class 文件这里边是二进制的字节码文件二进制字节码文件是给计算机看的
此时当前这两份文件都在磁盘当中都是在外部存储设备当中
当终端运行 java Hello 这个命令能将当前的二进制文件从磁盘放到内存中交给 CPU 运行然后输出 hello world 由于 java 这个命令可以将当前的二进制文件从磁盘放到内存中交给 CPU 运行那么该程序在内存空间中是什么样的呢接下来我们来讨论程序的内存空间部分。
程序的内存空间
数据类型决定数据在内存当中是如何存储的正在运行的程序在内存当中都必须要有自己的内存空间因为任何一个变量任何一个指针都需要内存空间来进行表达
数据在内存当中的存储位置是由操作系统所决定的程序的运行需要操作系统给它开辟内存空间当拥有这块内存空间后就由 java 程序自己去操作这一块内存空间该内存空间会被切分为以下几个区域 其中最重要的三个是 虚拟机栈、堆 和 方法区 虚拟机栈 控制着程序的执行 堆 是用来存储对象的 方法区 用于存储虚拟机加载的存储类信息、常量、静态变量、临时数据等 方法区中存储的也就是当前的 .class 文件
下面我们来具体讲解虚拟机栈和堆
认识虚拟机栈
我们来看这样一份代码文件 终端运行结果 下面我们来看程序的执行流程
程序的执行流程
程序的内存空间如下 其中虚拟机栈的执行流程如下 首先第一步 main 方法入栈入栈后表达程序对 “hello world” 做了输出之后它会调用 run() 方法入栈。run() 方法进行表达执行是从上到下执行第一步先定义一个局部变量 num 100num 本身是一个 int 类型的指针 num 是指向100的地址假设它的地址是 0x10 那么 num 就指向0x10输出完了之后调用 jump() 方法。jump() 方法里面也有一个局部变量 numnum 是从上边赋过来的值相当于是做了一次值传递相当于是把这个100传了过去继续执行输出jump() 也就执行完毕后出栈。那么又回到咱们当前这个 run() 方法了run 方法此时执行完这一行之后也就会出栈了这样就又回到 main() 方法了。main 方法中 run() 执行完毕 run() 出栈main() 接着会去执行下一个方法 aaa()aaa()入栈有一个局部变量 byte a 10输出后 aaa 执行完 main 方法出栈整个程序就执行完毕了。
程序的执行过程就是 main 方法从入站到出栈程序执行第一步是main方法入栈最后一步一定是main方法出栈。程序从开始执行到执行完毕是由 main 方法来对其进行控制的从上到下依次进行执行整个流程就是程序的执行过程程序的执行过程又被叫做 线程。
引申我们可以简单去理解 java 当中的多线程要想实现 java 当中的多线程就意味着我们需要多个程序的执行过程而如何实现 java 当中的多线程就需要多个虚拟机栈。
认识堆
在讲述堆之前我们先看 java 的类与对象的关系
java的类与对象的关系
有这样一份代码文件 我们发现打印结果里的 tom 和 jr 的名字不一样
下面具体讲解
new 关键字java保留字有实际含义在堆内存中开辟内存空间 Cat() 构造器是在创建对象的时候给对象赋值 tom 对象名或叫做变量名 Cat 数据类型引用数据类型中的类数据类型决定数据在内存当中是如何存储的 赋值操作将对象的地址值赋给变量
程序执行第一步main方法入栈之后它就会调用 Cat tom new Cat();首先 new 关键字会在堆里边开辟一块内存空间创建 tom 对象由 Cat 数据类型决定数据在内存当中存储形式Cat 里边有两个方法和一个变量 eat(String food)、catchMouse() 和变量 name‘aaa’会将该对象的地址值 0x1 赋给 tom 变量。 每 new 一次都要开辟新的内存空间Cat jr new Cat(); 会在堆中开辟一块内存空间创建 jr 对象同样地在该对象中有 eat(String food)、catchMouse() 和变量 name‘aaa’该对象的地址值 0x2 赋给 jr 变量。为什么此时 tom 和 jr 的是相同的因为他们具有相同的数据类型 Cat相同的数据类型的内存形式是一样的。但是在 main 函数中 jr.name jr; 对 jr 对象的 name 值进行了修改这样 jr 调用 name 输出的就不再是 ‘aaa’ 了而是 ‘jr’ 了。 一个类可以创建出多个对象tom 和 jr 是两个不同的对象但是它们的存储形式是相同的相同的数据类型内存形式是一样的。
类是创建对象的模板那么模板里边有什么那类里边有什么那对象当中就应该默认有什么
而 堆是用来存储对象的
总结类是创建对象的模板一个类可以创建多个对象 什么是 java 对象堆内存当中的存储结构