(基础)java内存加载过程,内存区域的划分
一个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清理!
?
?
?
?