Java运行编译机制和结构总结

详细看b站视频

一、jvm 内存划分

JVM java虚拟机 运行Java的容器
jre 运行Java的环境 提供运行时一些类,以及一些类组成的类库,例如util,long,集合,并发的类库
jdk java开发工具 提供javac编译器 Javadoc 生成帮助文档的文件 jar打包 javap 反汇编编译
jvm+运行是的类和库=jre jre+编译器等开发工具=jdk
在这里插入图片描述

在这里插入图片描述

1.编写的java代码是存在硬盘中 硬盘中的数据是永久保存的 运行的java程序会在内存中开辟空间
jvm将内存划分为五块 便于对数据的管理 以及对内存的优化(房子 厨房 客厅 卧室)

2.jvm内存划分

A. 栈内存 所有的局部变量 以及方法在运行的时候都会在栈内存中开辟空间
特点:先进后出 压栈与弹栈
栈帧每个方法进栈都有一个运行内存,这内存就是栈帧,方法运行完出战,就清除这块栈帧,栈帧上的局部变量就也随之清除
栈帧里分四个区域,分别为局部变量表,操作数栈,动态链接,方法出口
局部变量表存局部变量的地方,操作数栈即局部变量赋值和运算时的区域,也是栈结构,代码 int a = 1, b=2,c= (a+b)*10 运行,整数1先进栈,然后出栈赋值给局部变量a,整数2先进栈后出栈赋值给变量b,(a+b)*10,即整数1和2先进栈后出栈,进行加法运算得3,整数3进栈,然后整数10进栈,3和10出栈,进行乘法运算,得30,进栈赋值给c
动态链接 将代码中的符号引用 转为内存地址引用
方法出口 即记录方法的返回值,记录其他方法调用该方法的代码位置,结束该方法后回到其他方法对应的代码位置
B.堆内存 所有new 的资源 数组 对象都是在存在堆内存中
C.方法区 所有的字节码文件 class文件 以及静态资源都是存在方法区
例如:public static native Thread currentThread();
D.本地方法区 所有使用native 都是存在本地方法区中,就是调用c/c++代码
E. 程序计数器 由字节码执行引擎控制计数,比如1~10行代码,执行一行,i++,执行完第三行,计数为4,线程cpu时间片被抢,挂起,重新抢到就根据计数器的计数接着执行后续的代码

3.jvm架构
三大块: 类加载子系统,运行时数据区,字节码执行引擎
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
垃圾回收器: 收集并删除未引用的对象。可以通过调用"System.gc()"来触发垃圾回收,但并不保证会确实进行垃圾回收。JVM的垃圾回收只收集哪些由new关键字创建的对象。所以,如果不是用new创建的对象,你可以使用finalize函数来执行清理。

Java本地接口 (JNI): JNI 会与本地方法库进行交互并提供执行引擎所需的本地库。

c/c++ 软件 所有电脑系统都可安装,可是软件没有自己的指令,只能靠各自系统的机器指令,系统不一样,机器指令也会不一样,而Java软件自带字节码指令(JVM),不靠系统的机器指令,所以与平台无关,JVM会将字节码指令转换为本地系统的机器指令。

4.编译型和解释型
编译型需要接受所有的代码,然后在执行
解释性从上到下,读到哪运行到哪
5.cmd运行helloword
编写源文件(用记事本)→编译源文件(用javac.exe)→得到字节码文件→用解释器(java.exe)运行字节码文件,即转换为机器码在由系统执行。
源文件即.java文件,字节码文件即.class文件。
字节码内容截图
字节码文件内容截图,在oracle文档有对应的解释
对字节码文件使用javap 进行反汇编编译,javap -c Math.class > Math.txt,如下图
在这里插入图片描述
code 0~12 用来给程序计数器计数,iconst_1之类的是给jvm看的指令,具体作用看jvm指令手册
iconst_1 是将int类型常量1压入操作数栈,istore_1 将int类型值存入局部变量1,iload_1 从局部变量1中装载int类型值
iadd,从栈顶弹出两个元素做加法运算,将所得值进栈, bipush 10 将常量10 进栈

在这里插入图片描述
ideal中编写Person类,即源文件 .java文件 源代码 —》调用jdk中的javac进行编译生成 .class文件 —》点击运行,这里就是JVM的工作,类装载系统加载.class文件到运行时数据区,字节码执行引擎按顺序执行代码,同时修改程序计数器的计数,也控制垃圾回收器

先在方法区加载class信息,生成 成员方法的地址 ,代码从上往下运行,运行main方法,运行方法就在栈内存开辟空间,先进后出,然后用new创建对象,一用new就在堆内存开辟空间,并生成地址值,将地址值赋给变量,对象是对象变量,然后堆内存中为赋值的成员变量生成默认值,映射方法区方法的地址值。
在这里插入图片描述

一个源文件可有多个字节码文件即多个类,若源文件有多个类,则只能有一个类是public类,(表示可以没有public类)源文件名称必须与public类名称相同。若源文件没有public类,则只要和某个类名相同可以。类名称首字母一般大写,字节码文件只有一个类必须和类名相同。

位 bit 是计算机内部贮存数据的最小单位 11001100是一个八位二进制数
字节 byte 是计算机数据处理的基本单位,一般用B表示
1B= 8bit
字符是计算机的字母,数字,字和符号。
1B=8b
1024B=1kb
1024kb=1M
1024M=1G

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值