运行时数据区域--
虚拟机内存划分数据区域
程序计数器:线程私有,不会出现OutOfMemoryError
虚拟机栈-线程私有-生命周期与线程相同
描述方法执行的栈帧,存储局部变量表,操作栈,动态链接,方法出口,
一个方法被调用-直至执行完成的过程对应一个栈帧在虚拟机中从入栈到出栈的过程
局部变量表---存放编译器可知的各种基本数据类型,对象引用类型,返回地址类型
两种异常:
虚拟机栈不可以动态扩展的话,线程请求的栈深度大于允许的深度就会StackOverflowError
如果可以动态扩展但是无法申请到足够的内存,抛出OutOfMemoryError
本地方法栈
相似,也有两种错误
Java堆
内存中最大的一块
线程共享的,存放对象的实例
垃圾回收器管理的主要内存,GC堆(Garbage Collected Heap)
分代回收
方法区
共享的,存储被虚拟机加载的类信息,常量,静态变量,编译器编译后的代码数据
-----JDK1.8已经删除,使用元空间--直接内存
运行时常量池-方法区的一部分
直接内存
垃圾回收-堆,gc
Runtime -实例方法
System,静态方法,调用runtime
提示自动垃圾回收
finalize方法是释放对象占有的内存的时候执行-一般执行释放持有的资源
判断对象是否可以回收
引用计数算法----循环引用无法解开-不用
根搜索算法-
四种引用
强引用-普遍存在的引用-不会回收
软引用--内存溢出才回收
弱引用-
虚引用