Java--内存划分和递归

 程序 : 一堆代码的集合,是个可执行文件,但是是一个静态概念,一般保存在硬盘中

 进程 : 就是正在执行的可执行文件,是个动态概念,会按照程序的设计,在内存中一步步执行

 运行起来的程序,指的是载入到内存中的可执行文件,这个时候操作系统就会开启一个进程来运行这个内存中的文件对象,如果我们想关闭某个软件,可以直接结束这个进程即可

  java的内存划分和管理

 java 运行时数据区域,叫JVM内存

 分为 : 静态区/方法区 , VM栈,堆内存,本地栈,程序计数器

程序计数器 : 是一块比较小的内存,,可以看做字节码文件的指示器,分支,循环,跳转等,都需要程序计数器来完成

  静态区/方法区 :

是存放我们的程序文件的,载入内存后的class文件,在静态区存储,包括方法,静态属性都是在静态区的, 还有运行时常量池

VM栈 : 虚拟机栈,一般都叫栈内存

栈内存,是以栈数据结构为模型,开辟的一块内存空间

栈是一种数据结构,先进后出

栈构成因素 :

栈空间  : 就是以栈数据结构为模块开辟的空间 就叫栈空间

 栈帧 : 栈空间中的每一个元素,就是一个栈帧 

 栈顶元素 : 指最后一个放进去的栈帧,在最上面

栈底元素 : 指第一个放进去的栈帧,在最下面

 方法是在栈内存中 执行的

栈的操作 :

压栈 : 就是把栈帧放到栈空间的过程

弹栈 : 就是把栈帧从栈空间中弹出的过程

 本地栈 :

比如hashCode() 方法,前面 有个 native声明,本地,当我们执行这些方法的时候,会在本地栈执行

对于我们来说就是简单的调用方法,但是对于JVM来说,需要单独的空间来存储C的服务

结构和VM栈 一模一样

堆内存 :

用来保存对象的

每个对象空间,分为3大类

数据部分 : 成员变量xxx

头部 : hashCode值

类型 : 指向静态区中,创建该对象的这个class文件对象

 java程序运行 :

 首先开启java虚拟机,然后xx.class文件被载入到内存中的静态区,然后jvm自动调用该程序的main方法,main方法被调用,会在栈内存中开辟main方法的栈帧,然后把main方法代码复制进去执行,如果main中,没有其他方法调用,则顺序执行完后,弹栈退出,jvm关机;如果main方法,有其他方法调用,就在栈内存中再开辟一个栈帧,把该方法的代码复制进去执行; 如果被调用方法中,还有其他方法的调用,以此类推,执行完返回调用处,继续执行,一直到main方法都执行结束,弹栈,则JVM关机

 程序的加载 :

 静态加载 : 运行程序的时候,会一次性把所有相关的程序都载入

 动态加载 : 运行过程中,用到谁 就去加载谁

 java中采用 动态加载

 方法的执行 :

方法在调用的时候,才会在栈内存找那个开辟栈帧

 如果方法不调用,则不会再内存空间中划分空间,只保留在静态区

 方法调用 : 就等于压栈操作

 方法执行完成 : 就等于弹栈操作

递归:

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

斐波那契数列 : 
前两位为1 , 第三位开始,都等于前两位的和,(需熟练掌握,面试可能会用到)

要重点掌握递归的使用,理解内存的划分。要想掌握递归的使用就要理解压栈和弹栈的操作,方法中每次调用他自己这个方法就相当于压栈,把它压到最底了,然后一直压到开始弹栈,从最后压进来的开始弹栈,这就是所谓的先进后出。这个掌握了,就能很好地理解并使用递归。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值