1.内存划分
* 程序 : 一堆代码的集合,是个可执行文件,但是是一个静态概念,一般保存在硬盘中
*
* 进程 : 就是正在执行的可执行文件,是个动态概念,会按照程序的设计,在内存中一步步执行
* 运行起来的程序,指的是载入到内存中的可执行文件,这个时候操作系统就会开启一个进程来运行这个内存中的文件对象
* 如果我们想关闭某个软件,可以直接结束这个进程即可
*
* java的内存划分和管理
*
* Java Runtime Data Area : java 运行时数据区域,我们一般叫JVM内存
* 分为 : 静态区/方法区 , VM栈,堆内存,本地栈,程序计数器
*
* 程序计数器 : 是一块比较小的内存,,可以看做字节码文件的指示器,分支,循环,跳转等,都需要程序计数器来完成
*
* 静态区/方法区 :
* 是存放我们的程序文件的,载入内存后的class文件,在静态区存储
* 包括方法,静态属性都是在静态区的
* 还有运行时常量池
*
* VM栈 : 虚拟机栈,一般都叫栈内存
* 栈内存,是以栈数据结构为模型,开辟的一块内存空间
* 栈是一种数据结构,先进后出, 比如说 弹夹
* 栈构成因素 :
* 栈空间 : 就是以栈数据结构为模块开辟的空间 就叫栈空间
* 栈帧 : 栈空间中的每一个元素,就是一个栈帧 , 比如 弹夹 就是栈空间, 弹夹中的每一个子弹,就是栈帧
* 栈顶元素 : 指最后一个放进去的栈帧,在最上面
* 栈底元素 : 指第一个放进去的栈帧,在最下面
* 方法是在栈内存中 执行的
* 栈的操作 :
* 压栈 : 就是把栈帧放到栈空间的过程
* 弹栈 : 就是把栈帧从栈空间中弹出的过程
*
* 本地栈 :
* 比如hashCode() 方法,前面 有个 native声明,本地,当我们执行这些方法的时候,会在本地栈执行
* 对于我们来说就是简单的调用方法,但是对于JVM来说,需要单独的空间来存储C的服务
* 结构和VM栈 一模一样
*
* 堆内存 :
* 用来保存对象的,先不管
* 每个对象空间,分为3大类
* 数据部分 : 成员变量xxx
* 头部 : hashCode值
* 类型 : 指向静态区中,创建该对象的这个class文件对象
*
*
* java程序执行流程 :
*
* 1 编码
* 利用开发软件,编辑器进行编码,生成xx.java文件
* 2 编译
* 通过javac命令,把xx.java文件 编译成xx.class文件
* 3 运行
* 通过java命令,运行xx.class文件
* 3.1 开启java虚拟机,然后xx.class文件被载入到内存中的静态区
* 3.2 jvm自动调用该程序的main方法
* 3.3 main方法被调用,会在栈内存中开辟main方法的栈帧,然后把main方法代码复制进去执行
* 如果main中,没有其他方法调用,则顺序执行完后,弹栈退出,jvm关机
* 如果main方法,有其他方法调用,就在栈内存中再开辟一个栈帧,把该方法的代码复制进去执行
* 如果被调用方法中,还有其他方法的调用,以此类推,执行完返回调用处,继续执行
* 一直到main方法都执行结束,弹栈,则JVM关机
*
* 程序的加载 :
* 静态加载 : 运行程序的时候,会一次性把所有相关的程序都载入
* 动态加载 : 运行过程中,用到谁 就去加载谁
* java中采用 动态加载
*
* 方法的执行 :
* 方法在调用的时候,才会在栈内存找那个开辟栈帧
* 如果方法不调用,则不会再内存空间中划分空间,只保留在静态区
*
* 方法调用 : 就等于压栈操作
* 方法执行完成 : 就等于弹栈操作
、