目录
一、堆内存
1. 对象存储在堆中
JVM的三个区域 : 堆(heap) 、栈(stack)、方法区(method)
JVM为Java程序提供并管理所需要的内存空间
堆中存储使用new关键字创建的对象---数组、String、Person等等。
通过new创建的对象,在堆中。
2. 成员变量的生命周期
当一个引用值为null时,该对象没有任何引用指向,则该对象被视为废弃对象,属于被回收(GC线 程)范围。
成员变量的生命周期: 从对象在堆中创建,到对象从堆中被回收为止。
3. 垃圾回收机制
垃圾回收器(Garbage Collection ,GC),是JVM自带的一个线程(自动运行的),用于回收没有任何引用指向的对象。
垃圾回收器会自动帮Java程序员处理垃圾。
在main函数下面,有一个线程自动回收不用的对象,叫做守护线程。
4. 内存泄漏
内存泄漏: 不再使用的对象没有被及时回收,积攒过多导致程序奔溃。
5. System.gc()方法
GC线程不会刚发现无用对象就会回收,如果需要强制回收,则使用System.gc()方法
这个方法强制调度GC线程回收无用对象。
二、非堆-栈
1. 栈存的是方法中的局部变量
2. 局部变量的生命周期
生命周期: 栈帧被创建开始-方法执行完毕栈帧被销毁结束,局部变量也随之销毁。
栈帧中存储的是: 局部变量和参数等。
3. 成员变量和局部变量的区别
类中的变量叫:成员变量;方法中的变量叫:局部变量
成员变量:
- 定义在类中,方法之外,有默认的初始值
- 可以不显示的初始化,类实例化后,存储在堆中
- 对象被回收时成员变量失效
局部变量:
- 定义在方法中
- 没有默认值,声明时赋初值
- 方法被调用时,存在栈中,方法调用结束后,从栈中清除
三、非栈-方法区
1. 存放类的信息
2. 方法只有一份,唯一性
当类的信息加载到方法区时,类中的类方法的定义也被加载在方法区中。
无论创建多少对象,所有的对象是公用方法区中一个方法的定义。
四、堆、栈、方法区的区别
堆存的是成员变量
栈存的是局部变量
方法区存的是类信息