1、程序:一队代码的集合,是个可执行文件,但是时一个静态概念,一般保存在硬盘中
2、进程:正在执行的可执行文件,是个动态概念,会按照程序的设计,在内存中一步步执行
运行起来的程序,指的是载入到内存中的可执行文件,这个时候操作系统就会开启一个进程来运行这个内存中的文件对象。
3、java的内存划分和管理
Java Runtime Data Area:java运行时数据区域,我们一般叫JVM内存。
分为:私有内存区(VM栈、程序计数器、本地方法栈)和共享内存区(方法区、堆内存)
程序计数器是一块比较小的内存,可以看做字节码文件的指示器,分支,循环,跳转等,都需要程序计数器来完成。
静态区/方法区是存放我们的程序文件的,载入内存后的class文件,在静态区存储,包括方法,静态属性都是在静态区的,还有运行时 的常量池。
VM栈:虚拟机栈,一般都叫栈内存(是以数据结构为模型,开辟的一块地址空间),栈是一种数据结构,先进后出,比如弹夹
附:GC垃圾回收借鉴地址:GC垃圾回收 - 简书
4、栈的构成因素:栈空间(以数据结构为模板开辟的空间)、栈帧(栈空间中的每一个元素)、栈顶元素(最后一个放进去的栈帧,在最上面)、栈底元素(第一个放进去的栈帧,在最下面)、方法是在栈内存中执行的
5、栈的操作:压栈(把栈帧放到栈空间的过程)、弹栈(把栈帧从栈空间中弹出的过程)
6、本地栈:比如hashCode()方法,前面一个native声明,本地,当我们执行这些方法的时候,就会在本地栈执行。对于我们来说就是简单地调用方法,但是对于JVM来说,需要单独的空间来存存储的服务,结构和VM栈一样。
7、堆内存:用来保存对象的,先不管,每个对象空间,分为3大类,即数据部分(成员变量xxx)、头部(hashCode值)、类型(指向静态区中,常见该对象的这个class文件对象)。
8、java程序流程执行流程:编码(利用开发软件,编辑器进行编码,生成xx.java文件),编译(通过javac命令,把xx.java文件,编译成xx.class文件),运行(通过java命令,运行xx.class文件 8.1 8.2 8.3)
8.1、开启java虚拟机,然后xx.class文件被载入到内存中的静态区
8.2、jvm自动调用该程序的main方法
8.3、main方法被调用,会在栈内存中开辟main方法的栈帧,然后把main方法代码复制进去执行。
如果main中,没有其他方法调用,则顺序执行玩后,弹栈退出,jvm关机。
如果main方法,有其他方法调用,就在栈内存中再开辟一个栈帧,把该方法的代码复制进去执行。
如果被调用方法中,还有其他方法的调用,以此类推,执行完成后返回调用处,继续执行
一直到main方法都执行结束,弹栈,则jvm关机
9、程序的加载,分为静态加载(运行程序的时候会一次性吧左右相关的程序都载入)和动态加载(运行过程中,用到谁,就去加载谁),java中采用动态加载
10、方法的执行:方法在调用的时候,才会在栈内存找那个开辟栈帧。如果方法不调用,则不会在内存空间中划分空间,只保留在静态区。方法调用就等于压栈操作,方法执行完成就等于弹栈操作。
11、递归就是在方法中调用当前方法。递归也需要起始值、终止条件、步长、如果没有 ,就是死循环,导致栈内存溢出,常见异常
12、递归的应用场景:一般树状结构都可以使用递归 比如查询地区,树状的菜单系统
递归比普通的算法更消耗内存,巡行效率低,谨慎使用,能用循环搞定的,就不使用递归
13、递归常见问题:需要获取文件目录下的所有的子文件,斐波那契数列这种规律的,累加加和,汉诺塔等