1. 垃圾的定义
什么是垃圾?
运行程序中没有任何指针指向的对象
2. 为什么要垃圾回收
- 垃圾不回收的情况下,内存空间迟早会被占用完,影响应用程序的正常运行
- 垃圾回收可以进行内存碎片整理,保证大空间对象的分配
3. 早期的垃圾回收
在c/c++中都是使用手动垃圾回收的方式进行垃圾回收
具体的说: 使用new申请内存,使用delete回收内存
4. Java的内存管理机制
java使用自动内存管理的方式来对内存进行操作,内存的分配和回收都由java实现,不用开发人员手动分配及回收.
相较于c/c++来说,极大的省略了开发的复杂度,开发人员也无需担心忘记回收内存而导致的内存泄露问题.
可以称java为 (c++)--,减配版的c++,此处的减配意思是 1. 复杂度减小,不用关心内存回收 2. 手动回收相较于自动回收在某种程度上可能会有更好的性能,从这个角度说java是c++的减配版本
5. Java自动内存管理存在的问题
java使用垃圾回收器自动回收垃圾,那么相应的,开发人员对应内存分配和回收的能力就可能变弱,在发生内存泄露/内存溢出问题时,可能无法及时的找到问题
需要借助于一些监控工具,分析java的内存情况.
6. 垃圾回收的工作范围
垃圾回收主要针对堆和方法区
栈只有入栈和出栈操作,不存在垃圾回收,但是存在内存溢出问题
程序计数器不存在垃圾回收也不存在内存溢出问题
垃圾回收的分代机制:
- 主要针对新生代 YGC
- 较少针对老年代 MinorGC
- 基本不针对永久代(元空间) FULLGC
7. 垃圾回收的阶段
垃圾回收分为标记阶段和清除阶段