程序:可执行文件,是一对命令的集合,是个静态概念,保存在硬盘中
进程:就是正在执行的程序,是个动态概念,保存在运行内存中,会按照改程序的设计在内存中一步步执行
运行中的程序 也就是载入到内存中的可执行未见,操作系统会开启一个进程,用来保存运行的这个未闭环
如果想要关闭某个程序只需要在内存中把该进程杀死即可
java的内存划分和管理
java Runtime Data Area:java 运行时的数据区域,一般叫jvm内存
分为五大块:
1静态区、方法区 2 vm栈 3 堆内存 4 程序计数器 5 本地方法栈
程序计数器:是一块比较小的内存,字节码位置的指示器,比如当前执行到第几行之类,分支,循环,跳转等
静态区:是用来保存程序文件(class),载入到内存之后的class文件保存在静态区中
还有一些静态资源
vm栈:又叫栈内存,用来执行方法
是以栈数据结构为模型创建的一段空间:先进后出,类似于弹匣
栈空间:就是栈内存,就是以栈数据结构为模型创建的内存空间,叫栈空间
栈帧:栈空间中的元素就是栈帧,比如弹匣是栈空间的话,子弹就是栈帧
栈底元素:第一个放进去的栈帧
栈顶元素:最后一个放进去的栈帧
栈操作:
压栈:就是指向栈空间中添加栈帧的过程,类似吧子弹放到弹匣中,叫压栈
弹栈:就是指把栈帧在栈空间中弹出的过程
本地方法栈:用来执行本地方法,和栈内存一样,使用native修饰的方法,和我们没关系
堆内存:用来保存对象
1 javac编译 生成class文件
2 java命令 运行
2.1 开启java虚拟机,然后吧对应的文件 xxx。class载入内存中的静态区
2.2 载入之后。jvm自动调用改程序中main方法,然后再栈内存开辟main方法栈帧,开始执行
2.3 如果main方法中没有其他方法调用,则执行完结束,销毁即可
2.4 如果main方法中有其他方法的调用,如果是其他类中的方法,则吧对应类也会加载到静态区,然后调用该方法
2.5 如果是当前类的方法,直接在栈内存中继续压栈即可
2.6 如果被调用方法中还有其他方法调用的话,则步骤同上
2.7 一直到最后一个压栈的方法执行完,弹栈,然后再一次返回调用处继续执行
2.8 一直到main方法执行完,弹栈,程序销毁
方法的调用就等于是压栈操作
方法的调用结束就等于是弹栈操作
静态加载:程序开始执行,首先吧所有和程序相关的类全部一次性载入
动态加载:开始执行的时候,只加载必须的类,在执行的过程中需要用到其他类再去加载
java中采用的是动态加载
递归:在方法体中,调用当前的方法(自己调用自己)
基本思想:递归和迭代是等价的(迭代就是循环)一次类推 是基本思想
三要素:初始值。终止条件。步长
一般树状结构的都可以使用递归操作
比如查询地区,树状菜单,文件目录等
递归的算法比普通算法更消耗内存,谨慎使用,能用循环完成就不用递归完成,除非某些树状情况只能使用递归搞定
递归面试题:1文件夹复制2裴波那契数列
栈内存溢出,就是满了
1程序有问题,死循环了
2程序没有问题,就是装不下了
除了前两位是1后面每一位都是前两位的加和