内存区域储存一些什么:
方法区:
存放方法,主要是指令数据,以字节码为代表的指令数据,也会有部分附属的方法基本信息(扩展来说,就是存放类信息)。
逻辑上,类的相关数据会存放在方法区
逻辑上,方法会存放在方法区
逻辑上,静态属性会存放在方法区
堆:
堆砌对象的地方,以对象为单位进行管理
属性空间随着对象走,所以逻辑上,属性是保存在堆中
栈:
以栈帧为基本单位
逻辑上,临时变量(局部变量)就是保存在栈区
随着方法本次执行出现,本次执行结束消亡
PC寄存器:
存储下一条要执行的指令位置
程序计数器:
变量的形态决定了,变量的保存位置(变量的属性不行)
变量的三大形态:
1、局部变量:
①普通的局部变量
②方法中的形参
③try-with-resource
④catch(...)
2、属性(类中的,没有static)
3、静态属性(类中的,有static)
执行引擎:
类加载器<->内存空间<->执行引擎
执行引擎:就是对CPU模拟,所以CPU怎么工作的,这个执行引擎就怎么工作
1、读取CPU中保存的值(一般是地址)
2、根据CPU中的值,去内存中(方法区),读取一条指令
3、执行具体的字节码
4、默认情况下PC值会加1(语句自动执行下一条)但有些字节码会修改PC的值(if,else...)
GC:垃圾回收
有了GC之后,相对的解放了开发人员的心智,让开发人员只需要考虑什么时候需要一块内存,不需要考虑什么内存不再需要
从权力和义务的角度来讲,逻辑上把内存的使用权和所有权分离出来,我们只享受一段内存的使用权,没有所有权
好处:不需要考虑内存释放的问题
坏处:内存的直接彻底与我们无缘了
GC:堆内存管理
堆上的内存是以对象为基本单位进行管理
GC:垃圾对象的回收问题
如何判断是否是垃圾对象:
一、引用计数法:
这种有循环引用:
为了避免这个问题又有了一个可达性分析法:
这时我们已经找到了,垃圾对象了,就开始进行垃圾回收:
GC相当于房东,有很多房间,分配内存(把房子租出去),回收内存(把房子收回来)
回收:只是改变状态(把房子从出租中变为空闲)
整理内存:
由于整理过程,是GC变得复杂,耗时变得无法接受,需要进行设计,来对GC性能进行优化
现代JVM由于GC问题,把堆空间再次分区域进行归纳和管理----分代
因为是4bit来记录年龄,即16