什么是垃圾?
垃圾是指在程序运行中没有任何指针指向的对象,这个需要被回收的对象就是垃圾。
如果不及时对内存的垃圾进行清理,那么这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用,甚至可能导致内存溢出。
为什么需要GC?
- 对于高级语言来说,一个基本认知是如果不进行垃圾回收,内存迟早都会被消耗完。因为不断地分配内存空间而不进行回收,就好像不停地生产垃圾而不去清理。
- 除了是否没用的对象,垃圾回收也可以清除内存里的记录碎片。碎片整理讲所占用的堆内存移动到堆的一端口,以便JVM将整理出的内存分配给新的对象。
- 随着应用程序所应付的业务越来越庞大且复杂,用户越来越多,没有GC就不能保证应用程序的正常进行。而经常造成STW的GC又跟不上实际的需求,所以才会不断地尝试对GC进行优化。
Java的垃圾回收机制
- 自动内存管理。无需开发人员手动参与内存的分配与回收,这样降低了内存泄漏和内存溢出的风险。没有垃圾回收,Java也会和C++一样,各种悬垂指针,野指针,内存泄漏问题让你头疼不已。
- 自动内存管理机制。将程序员从繁重的内存管理中释放出来,可以更专心地专注于业务开发。
- 垃圾回收可以对年轻代回收,也可以对老年代回收,甚至是整堆和方法区回收。其中,Java的堆是垃圾回收的重点区域。
- 从次数上讲,频繁收集Young区,较少收集 Old区,基本不动Perm区。
担忧
- 对于 Java 开发人员而言,自动内存管理就像是一个黑匣子。如果过度依赖于“自动”,那么这将会是一场灾难,最严重的就是会弱化开发人员在程序出现内存溢出时定位问题的能力。
- 了解JVM的自动内存分配与内存回收原理显得非常重要,只有真正了解JVM是如何管理内存后,才能够在遇到OutOfMemoryError时,快速地根据错误异常日志定位问题和解决问题。
- 当需要排查各种溢出,内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须堆这些“自动化”的技术实施必要的监控和调节。
面试题
- 你知道哪几种垃圾回收器,各自的优缺点是什么。重点讲一下CMS和G1。
- JVM GC算法有哪些,目前的JDK版本采用什么回收算法?
- 讲一下G1垃圾收集器的回收过程。
- GC是什么,为什么要有GC?
- GC的两种判定方法是什么?CMS垃圾收集器与G1垃圾收集器的特点是什么?
- 说一下GC垃圾收集算法?
- JVM GC原理,JVM怎么回收内存?
- CMS的特点是什么,垃圾回收算法有哪些?各自的优缺点是什么?它们的共同的特点是什么?
- Java的垃圾收集器有哪些?说一下G1垃圾收集器的应用场景,平时你是如何搭配使用垃圾回收器的?
- 你知道几种垃圾收集器,各自的优缺点是什么?重点讲一下CMS和G1,包括原理、流程、优缺点。垃圾回收算法的实现原理是什么?
- 讲一讲垃圾回收算法?
- 什么情况下触发垃圾回收?
- 如何选择合适的垃圾收集算法?
- 常见的垃圾回收算法有哪些,各有什么优劣?
- system.gc()和runtime.gc()会做什么事情?
- Java GC机制?GC Roots有哪些?
- Java对象的回收方式,回收算法?
- CMS回收停顿几次?为啥要停顿那么多次?