1、垃圾
1.1、关于垃圾收集的三个经典问题
- 哪些内存要回收
- 什么时候回收
- 怎么回收
1.2、垃圾
- 指运行程序中没有任何指针指向的对象
- 如果不回收,那么会一直保留到应用程序结束
1.3、为什么要GC
- 如果不进行垃圾回收,那么内存会被消耗完
- 在进行GC的时候,JVM可以进行碎片整理,将所占用的堆内存移到堆的一端
- 没有GC,程序不能正常进行,有了GC又有STW,所以要不断对GC进行优化
2、早期垃圾回收
- 早期c/c++,垃圾要手动回收,使用new申请,delete手动释放
- 开发人员不便,如果程序员忘记回收垃圾,那么会内存泄漏,内存泄漏多了,消耗内存足够多,就会内存溢出
-
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;
-
内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,其实就是自己用完了不释放,一直在引用
3、Java垃圾回收机制
- 自动内存管理,无需程序员手动回收,降低内存泄漏和溢出风险
- 开发人专注于业务开发
- 但是弱化了开发人员定位内存泄漏和溢出问题的根源
- 所以要好好学习底层,防止问题的出现
- GC作用于方法区和堆,主要是堆
- 频繁回收年轻代
- 较少回收老年代
-
基本不动永久代(方法区)