哪些可以作为GC Roots?
1.在虚拟机栈(栈帧中的本地变量表)中引用的对象。
2.方法区中类静态属性引用的对象。
3.在方法区中引用的对象,如字符串常量池(String Table)
里的引用
4.本地方法栈中JNI引用的对象
5.Java虚拟机内部的引用,如基本数据类型对应的Class对象以及一些常驻的异常对象等。
6.所有同步锁持有的对象
7.反应Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等
前提:
当Java虚拟机发觉内存资源紧张的时候,就会自动地去清理无用变量所占用的内存空间。当然,程序员可以在Java程序中显式地使用System.gc()或Runtime.getRuntime().gc()来通知垃圾回收程序,至于垃圾回收程序运不运行,什么时候运行,都是无法控制的。
如果对象引用被置为null,垃圾收集器不会立即释放对象占用的内存
而会在下一个垃圾回收周期中,这个对象将是可被回收的.
是可被回收的:并不是说下一个回收周期,一定去释放。释放针对的是一段已被使用的内存,
回收是垃圾收集器的一个动作,结果就是释放内存。
标记清除
标记压缩
复制算法