1 垃圾回收概述
垃圾回收,不是Java的伴生物,早在1960年,第一门开始使用内存动态分配和垃圾回收技术的Lisp语言诞生
关于垃圾回收,有3个经典问题:
1,哪些内存需要回收?
2,什么时候回收?
3,如何回收?
如今垃圾回收已是Java的招牌能力,极大的提高了开发效率,且垃圾回收已经成了现代语言的标配,Java的垃圾回收机制也在不断的演进中
1.1 什么是垃圾
垃圾: 指程序运行时没有任何指针指向的对象,失去了引用的对象就是需要被回收的垃圾
如果不及时对内存中的垃圾进行清理,那么这些垃圾对象所占用的内存空间会一直保留到程序结束,被占用的内存空间无法被其它对象所使用,甚至可能导致内存溢出
1.2 为什么需要GC
对于高级语言来说,一个基本认知是如果不进行垃圾回收,内存迟早会被消耗完,因为不断分配内存空间而不回收内存空间,就像在房间里一直点外卖,不打扫一样
除了释放没有到的对象,垃圾回收也可以清除内存里的记录碎片,碎片整理将所占用的堆内存移动到堆的一端,以便JVM将整理出的内存分配给新的对象
随着业务越来越庞大,复杂,没有GC就不能保证应用程序的正常进行,但GC会引起STW,多次的STW会影响程序的效率,为此才会对GC进行不断地优化
1.3 早期垃圾回收
在早期的C/C++时代,垃圾回收基本上都是开发者手工进行的,如使用new进行内存申请,使用delete进行内存释放:
MibBrige *pBridge = new cmBaseGroupBridge();
if(pBridge->Register(kDestroy) != NO_ERROR) {
delete pBridge;
}
这种方式可以灵活主动的控制内存的创建和释放,但是会给开发者带来频繁申请和释放内存的管理负担,倘若有一处内存忘记释放,就会造成内存泄漏,垃圾对象永远无法被释放,随着系统不断运行,多次的内存泄漏就可能导致内存溢出,从而使程序崩溃
在有了垃圾回收机制后,上述的代码可以这样写:
MibBrige *pBridge = new cmBaseGroupBridge();
pBridge->Register(kDestroy);
现在,除了Java外,C#,Python,Ruby等语言都使用了自动垃圾回收的思想,也是未来的发展趋势,自动化的内存分配和自动垃圾回收是现代开发语言的标配
1.4 Java垃圾回收机制
Java的自动内存管理功能,无需开发者手动参与内存的分配和回收,这样降低了内存泄漏和内存溢出的风险,将开发者从繁重的内存管理中解放,专注于业务开发
如果没有垃圾回收器,Java也会和C++一样,各种悬垂指针,野指针,出现各种内存泄漏问题,但是过于依赖"自动",也是一种灾难,将内存的分配和回收全部交给JVM,会严重的弱化开发者在程序出现内存泄漏时定位能力和解决问题的能力
为此需要了解JVM的自动内存管理就十分重要,当真正了解JVM如何管理内存时,当遇到OOM时,才能快速地根据异常日志定位问题并解决,当垃圾回收成为系统达到更高并发量地瓶颈时,就需要对"自动化"的技术实施必要的监控和调节

垃圾回收可以对堆中年轻代回收,也可以对堆中老年代进行回收,甚至是整堆回收和方法区的回收,其中堆是垃圾收集器的工作重点,从次数上来讲:
频繁收集Young
较少收集Old
基本不动MetaSpace
本文介绍了垃圾回收的基本概念,包括什么是垃圾、为何需要GC以及早期的垃圾回收方式。着重讨论了Java的垃圾回收机制,指出其如何自动化内存管理,降低内存泄漏风险。同时,提到了GC对堆和方法区的回收策略,并强调理解JVM内存管理对解决性能问题的重要性。

317

被折叠的 条评论
为什么被折叠?



