目标: 熟悉GC常用算法, 熟悉常见垃圾收集器, 具有实际JVM调优实战经验
什么是垃圾 garbage?
没有被对象引用的对象, 就是垃圾对象
Java VS C++
Java
GC处理垃圾
开发效率高, 执行效率低 ( 总体来看, 多花了一步操作, 去遍历和确认垃圾 )
C++
手工处理垃圾, 比较精确, 所以高效 ( 不需要花时间去扫描和确定谁是垃圾 )
忘记回收 -> 内存泄露
回收多次 -> 非法访问
开发效率低, 执行效率高
How to find a garbage
引用计数 reference count
引用计数法不能解决的问题: 循环引用
这三个对象引用计数都是1, 最后没有被清理
但是没有其他引用用到这三个对象, 会一直占用内存, 按理应该被清理掉
Root Searching 根可达算法
解决引用计数法无法解决的循环引用问题
哪些对象属于GC roots
线程栈变量JVM stack: main方法会起一个线程, 并且可能会启动多个子线程, 这些线程都会有自己的线程栈stack, 这些个栈帧里存的就是"线程栈变量"
静态变量: static references in method area
常量池 ( runtime constant pool ) : string/int常量池, static final int a=5这种
JNI指针: native method stack