一个java程序从源程序到运行,都经历了哪些内存加载过程呢?
1.javac命令
启动编译器,由编译器将java源文件编译为字节码文件,该字节码文件放在硬盘上
2.java命令
启动JVM,由虚拟机加载指定的类到内存(JVM在电脑上申请到的一部分内存空间)中
JVM将取寻找该类中的main(),从该入口开始运行程序,如果没有,抛NoSuchMethodError:main
==============================================================================
函数的执行过程
一定要理解栈的原理:先进后出FILO,栈帧始终指向栈顶位置,指向哪儿就运行哪儿的代码
public static void main(String[] args) {
int a = A();
syso(a);
B();
}
JVM首先从程序的入口(即main方法)开始执行程序
首先,main()入栈
执行第一行代码,发现调用到A()
然后,A()入栈
A()执行完毕,返回结果给调用者
A()出栈
JVM继续执行main()第二行代码,syso(a);
JVM继续执行第三行代码,发现调用到B()
接着,B()入栈
B()执行完毕
B()出栈
JVM继续执行main(),发现代码已执行完毕
最后,main()出栈
程序结束!
方法不断调用方法,方法不断压栈,上面的方法执行完毕,不断出栈,直到所有被调用到的方法执行完毕,程序才结束。
这就是程序在内存中执行的过程:由栈和栈帧来控制!
==============================================================================
JVM如果管理内存
java中的内存划分,一共分为5大块
java虚拟机申请到一片内存区域后,会对内存进行划分
不同区域的功能不同,内部数据的处理方式不同,所以需要单独划分,单独管理
寄存器内存 CPU处理数据的区域
本地方法区内存 运行本地系统平台中的程序,不同系统会安装不同的JVM
方法区 内存
栈内存 存储的都是局部变量,随时释放(方法中的变量,循环中的变量,代码块中的变量等)
堆内存 存储数组和对象(凡是new出来的都在堆中)
堆中的变量都有默认初始值
整数:0
小数:0.0f,0.0
字符:'\u0000' unicode码
布尔:false
引用类型:null
分析以下代码的加载过程和内存分配
public class Test {
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr.length);
}
}
首先,
main()方法 和 arr局部变量 入栈
然后,
new int[10],JVM为其在堆内存中开辟3个连续的内存空间并初始化0(每个单元占4个字节-int类型)
JVM将这片内存空间的首地址赋给arr存储起来
接着根据arr指向的内存空间,结合数组的类型为int,计算数组的长度并打印数组长度
最后,
main()执行完毕,main()和arr出栈
由于arr出栈,生命周期结束,堆中存储数组的10个连续空间没有变量引用了,将被GC清理!