一、局部变量与全局变量
- 概述
成员(全局)变量:定义在类中的变量
局部变量:定义在方法的变量 - 区别
(1)、应用范围:成员变量在整个类中都有效;而局部变量只在其声明的方法内有效。
(2)、生命周期:成员变量属于对象,随着对象的创建而创建,随着对象的消失而消失;而局部变量使用完马上释放空间。
(3)、存储位置:成员变量隶属于对象,它存在在堆内。当没有指引指向它时,才会被当做垃圾清理;而局部变量存在在桟内存中,当不再使用时,马上就会被释放。
(4)、初始值:成员变量存储在堆中,如果没有赋初值,会有默认值;而局部变量要想使用必须先初始化赋值。
二、内存分析
下图是运行时各数据内存存放图
- 程序计数器:是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器
- Java虚拟机栈:我们通常所说的栈,方法的调用执行在栈中,当方法被调用的时候方法进栈,当方法执行完毕时方法出战
- 本地方法栈:为虚拟机使用到的本地(Native)方法服务
- 堆:是虚拟机所管理的内存中最大的一块。主要存放对象实例,所有的对象实例以及数组都应当在堆上分配
- 方法区:主要存放存储类的结构,比如运行时常量池、字段和方法数据,以及方法和构造函数的代码,包括类和实例初始化以及接口初始化中使用的特殊方法。方法的调用时并不是在方法区进行的,而是对应着方法的进栈和出栈
三、垃圾回收算法
- 基本概念
内存分配:由JVM自动为对象分配相应的内存空间
内存释放:由JVM提供垃圾回收机制自动的释放内存空间
垃圾对象:是不再被任何引用指向的对象
垃圾回收机制(GC:Garbage Collection):将垃圾对象所占用的堆内存进行回收 。我们可以调用System.gc()或Runtime().gc()通知垃圾回收器收集垃圾,执行代码后并不意味着会立即启动垃圾回收机制开始回收,但能加快垃圾回收机制的运行
- 垃圾的判断
引用计数法:给对象添加一个计数器,每当一个地方需要引用该对象,就给计数器加1,当引用失效则计数器减1。如果计数器为0了,就代表该对象已经成为垃圾
可达性分析算法
- 垃圾收回常见算法
标记清除算法:分为“标记”和“清除”两个阶段
标记整理算法:与标记清除算法多了一个整理的阶段
标记赋值算法:将可以内存按容量划分为大小相等的两块,每次只使用一块。当这一块的内存用完了,就将还存活着的对象赋值到另一块上面,然后再把已使用过的垃圾内存空间一次清理掉
三、匿名对象
没有名字的对象。适用与某对象只使用一次
四、null
null表示引用未指向实际的对象,例如
Test t = null;
System.out.println(t.getName) //会报空指针的异常