内存划分
程序和进程
程序 : 可执行文件(指令集合),是个静态概念,一般保存在硬盘中
进程 : 正在执行的文件,是一个动态概念,运行起来的程序,就是指载入到内存中的可执行文件,这个时候操作系统会开启一个进程来运行内存中的这个文件对象,如果要关闭某个程序,就可以直接杀死这个进程
JVM内存划分
Xxx.class 是个静态概念,保存在硬盘中,当我们执行java 运行命令的时候,会把该class文件载入内存中
Java Runtime Data Area : java运行时数据区域,我们一般叫JVM内存
内存被划分为5个区域 : 程序计数器,方法区/静态区/静态代码段 , 栈内存(虚拟机栈) , 本地方法栈 , 堆内存
程序计数器 : 是一块较小的内存区域,作用可以看做是当前执行的行号,比如 if , 循环, 跳转,异常处理等 都需要依赖程序计数器来完成
静态区/方法区/静态代码段 : 是用来存放我们载入内存中的class文件,包括我们的方法,还有代码段都会保存在静态区内部还有一个运行常量池
虚拟机栈 : 又叫栈内存
方法是在栈内存中执行的,包括局部变量也是在栈内存
栈内存 : 是一个以栈数据结构为模型,创建的一段空间
栈 : 是一种数据结构,先进后出,类似于子弹夹
栈空间 : 就是指以栈数据结构为模型开辟的空间
栈帧 : 就是栈内存中每一个栈元素
栈顶元素 : 指最后一个保存进去的元素
栈底元素 : 指最先保存进去的元素 栈操作
压栈 : 把元素添加到栈空间的过程
弹栈 : 在栈空间中把数据删除的过程
本地栈 : 和VM栈结构一致,只不过是用来执行本地方法,比如 hashCode(),我们自己写的方法都在VM栈执行
堆内存 : 用来保存对象根据静态区的class文件,创建的用于存储成员属性的空间每个对象空间
1 头部部分 : hashCode值
2 数据部分 : 成员变量
3 类型 : 是由哪个类创建的对象,静态区的地址
*注意:*栈内存是真正执行程序的地方,其他内存都是存储数据方法调用 就等于是 压栈操作方法执行结束 就等于是 弹栈操作
动态加载和静态加载
动态加载 : 只载入当前程序和需要的文件,如果执行过程中需要别的文件,再去硬盘中找
静态加载 : 开始执行,把所有和当前程序相关的文件,全部一次性载入
数组
***静态声明:***在知道数组中每一个元素的值情况下,使用静态声明,在创建数组的同时就位数组元素分配空间并赋值
数据类型【】 变量={值,值,值…}
***动态声明:***预先不知道保存具体值的情况下使用动态声明,会用对应的默认值占位,需要指定长度
数据类型【】 = new 数据类型【长度】