引言
- 垃圾回收不是Java语言的伴生产物。早在1960年,Lisp语言是第一门使用动态内存分配和垃圾收集技术的语言。
- 垃圾回收的的三个经典问题:
- 哪些内存需要回收?
- 什么时候进行回收?
- 如何回收?
一、什么是垃圾?
垃圾的概念
- 运行程序中,没有任何指针指向的对象。
二、为什么需要垃圾回收?
- 内存利用角度:
- 如果不及时对内存中的垃圾进行清理,则垃圾会一致保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。
- 清除内存的碎片空间,整理出来供新对象使用。
- 垃圾收集已成为现代语言的标配。业务越来越庞大和复杂,没有GC就不能保证应用程序的正常进行,经常造成STW的GC跟不上实际的需求,所以不断尝试对GC进行优化。
三、早期垃圾回收
C与C++的垃圾回收
内存管理方式说明
- new 关键字进行内存申请,delete关键字进行内存释放。
int main()
{
MiBridge *pBridge = new cmBaseGroupBridge();
// 如果注册失败,则使用delete释放该对象所占内存区域
if(pBridge->redister(k_destroy) != NO_ERRROR)
{
delete pBridge;
}
}
- new 关键字进行内存申请,delete关键字进行内存释放。
优势与劣势
- 优势:灵活控制内存释放时机。
- 劣势:频繁申请和释放内存管理的负担。
- 如果某个地方,开发人员忘记释放内存,时间增长后,垃圾对象永远无法被清除,最终可导致程序崩溃。
四、Java垃圾回收机制
1. 自动内存管理(分配 + 回收)
优势
- 内存泄漏和内存溢出的风险降低。
- 降低悬垂指针、野指针、泄露问题的风险。
- 使得开发人员专注于业务开发。
担忧
- 在内存溢出等场景,开发人员的问题解决能力弱化。
- 垃圾收集成为系统的瓶颈时,必须对这些技术实施必要的监控和调节。
2. Java 垃圾回收概述
- 堆是垃圾收集器的工作重点。
- 频繁收集Young区。
- 较少收集Old区。
- 基本不动Perm区(或元空间)。