前言
- 垃圾收集,很多语言都存在垃圾收集技术,也成为后来高级语言的主流.让开发者不在关系底层的内存申请回收,聚焦业务功能的实现
- 垃圾回收的三大经验问题
- 那些内存需要回收? 什么是垃圾? 对应垃圾的标记阶段和标记算法
- 什么时候回收? 对应垃圾回收算法
- 如何回收? 对应垃圾的回收算法
什么是垃圾?
- 垃圾是指在运行程序中没有任何指针指向的对象,该对象就是需要被回收的垃圾
- 如果不及时堆内存中的垃圾进行清理,那么这些垃圾会一直保留到程序进程结束,被保留的内存空间也无法被其他对象使用,甚至导致内存溢出
为什么需要GC
- 对于高级语言来说,一个基本认知就是如果不进行垃圾回收,内存迟早就会消耗完
- 除了释放没用的对象,垃圾回收也应该清除内存里的碎片.碎片整理使得所占用的堆空间移动到堆一段,以便JVM将整理出来的内存分配给新的对象
- 随着应用程序的业务越来越庞大和复杂 用户量增多,没有GC就不能保证应用程序的正常运行.因为GC会导致STW降低用户体验,所以每次JDK迭代的时候都会堆GC进行优化
早期垃圾回收
- 在早期C和C++时代,垃圾回收基本是手工进行.开发人员使用new关键字申请内存,使用delete free()函数进行内存释放
- 该方式灵活控制内存的申请和释放,但会给开发人员带来频繁的申请和释放内存的管理负担.稍有不慎因编码问题使得内存忘记回收就会产生内存泄漏.垃圾对象永远无法被清除,随着系统运行时间增长,垃圾对象所消耗的内存持续上升,直到内存溢出
java垃圾回收优缺点
-
优点
-
自动内存管理,无需开发人员手动参与内存分配和回收,降低内存泄漏和内存溢出的风险
-
没有GC,java也会和C++一样,各种悬垂指针,野指针,泄漏问题
-
自动内存管理机制,将程序员从繁重的内存管理中释放,更专心业务开发
-
oracle官网关于垃圾回收的介绍 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html
-
缺点
-
对于开发者,自动内存管理如何黑匣子,如果过度依赖自动.最严重的就是弱化java开发人员在程序出现内存溢出定位问题和解决问题的能力
-
因此,了解JVM内存分配和内存回收原理就非常重要.真正了解JVM如何管理内存之后,才能在遇到OOM时候快速定位问题和解决问题
-
当需要排查内存溢出和内存泄漏问题时,当垃圾手机成为系统更高并发的瓶颈,此时我们就需要对这里自动化技术实施必要的监控和调节
GC主要关注的区域
GC主要关注方法区和堆中的垃圾回收
垃圾收集器可以对新生代回收,也可以对老年代,设置全栈和方法区的回收
- 其中,java是垃圾收集器的工作重点
从次数上讲:
- 频繁收集Young区
- 较少是收集Old区
- 基本不收集Perm区或者MetaSpace