- 当垃圾回收器准备好释放对象占用的空间,将首先调用其finalize()方法,并且在下一次垃圾回收器动作发生时,才会真正的回收对象所占用的内存.
- 对象可能不被垃圾回收
- 垃圾回收不等于"析构"
- 垃圾回收只与内存相关(垃圾回收的唯一原因是为了回收程序不再使用的内存)
- 如果JVM没有面临内存耗尽的情况下,它是不会浪费时间去执行垃圾回收以恢复内存的
- 垃圾回收器如何工作?
- 垃圾回收器对于提高对象的创建速度有明显的效果,JAVA从堆分配空间的速度可以和其他语言从栈上分配空间的速度媲美
- 垃圾回收的"自适应"技术
标记--清除:
从栈和静态存储区开始,遍历所有的引用,找到活的对象(遍历该对象的所有引用),并给对象标记,当标记完成后 再进行清理
清理后的空间是断断续续的,而且这种方式速度相当慢
停止--复制:
首先开始一块较大的内存空间,然后还是从栈和静态存储区开始遍历所有引用,找到活的对象(以及该对象引用), 找到一个活的就复制一个开辟的那块内存空间,并修正引用,新的空间里对象是紧密相连的。
以上两种凡是都要在程序暂停的时候才运行
JVM会进行监视如果所有的对象都很稳定,垃圾回收器的效率降低的话,那么就会切换到"标记--清除"方式;通用会跟踪"标记- -清除"的效果,如果要是出现了很多空间碎片的话,就要切换回到"停止--复制"的方式.
停止--复制>>>对象稳定效果降低>>>标记--清除>>>空间碎片产生的太多>>>停止--复制>>>
这就是”自适应“技术
JVM中有许多附加技术用于提升速度,尤其是与加载器操作相关的,被称为”(Just-In-Time,JIT)即使编译器“的技术
它可以把程序全部或部分编译成本机机器码(本来是JVM做的事情),用于提升速度
当需要装载某个类时,会找到其class文件,然后将该类的字节码装入内存。这里有两个方案
1. 全部编译:但需要花费更多的时间,并会增长可执行代码的长度。
2. 惰性评估:在必要时才会编译
现版本的JDK中,代码每次执行都会得到优化,执行的次数越多那么速度也就越快