2021 -06-27

*
 * 程序 : 一堆代码的集合,是个可执行文件,但是是一个静态概念,一般保存在硬盘中 
 * 
 * 进程 : 就是正在执行的可执行文件,是个动态概念,会按照程序的设计,在内存中一步步执行
 *             运行起来的程序,指的是载入到内存中的可执行文件,这个时候操作系统就会开启一个进程来运行这个内存中的文件对象
 *             如果我们想关闭某个软件,可以直接结束这个进程即可
 * 
 *  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中采用 动态加载
 * 
 * 方法的执行 : 
 *         方法在调用的时候,才会在栈内存找那个开辟栈帧
 *         如果方法不调用,则不会再内存空间中划分空间,只保留在静态区
 * 
 *         方法调用 : 就等于压栈操作
 *         方法执行完成 : 就等于弹栈操作

递归 : 在方法中调用当前方法
 * 
 * 基本思想 : 以此类推
 * 
 * 所以 递归也需要 起始值,终止条件,步长,如果没有 就是死循环,导致栈内存溢出
 * 
 * 
 * 应用场景 : 
 *         一般树状结构都可以使用递归
 *             比如查询地区,树状的菜单系统
 *         递归比普通的算法更消耗内存,运行效率低,谨慎使用,能用循环搞定的,就不使用递归
 * 
 *     常见问题 : 
 *         需要获取文件目录下所有的子文件
 *         斐波那契数列这种规律的也可以
 *         累加加和
 *         汉诺塔等
 * 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值