现在的位置: 首页 > 综合 > 正文

Java的垃圾回收

2013年08月24日 ⁄ 综合 ⁄ 共 841字 ⁄ 字号 评论关闭

     

    • 当垃圾回收器准备好释放对象占用的空间,将首先调用其finalize()方法,并且在下一次垃圾回收器动作发生时,才会真正的回收对象所占用的内存.

      • 对象可能不被垃圾回收
      • 垃圾回收不等于"析构"
      • 垃圾回收只与内存相关(垃圾回收的唯一原因是为了回收程序不再使用的内存)
    • 如果JVM没有面临内存耗尽的情况下,它是不会浪费时间去执行垃圾回收以恢复内存的
    • 垃圾回收器如何工作?
      • 垃圾回收器对于提高对象的创建速度有明显的效果,JAVA从堆分配空间的速度可以和其他语言从栈上分配空间的速度媲美
      • 垃圾回收的"自适应"技术

      标记--清除:

      从栈和静态存储区开始,遍历所有的引用,找到活的对象(遍历该对象的所有引用),并给对象标记,当标记完成后 再进行清理

      清理后的空间是断断续续的,而且这种方式速度相当慢

      停止--复制:

      首先开始一块较大的内存空间,然后还是从栈和静态存储区开始遍历所有引用,找到活的对象(以及该对象引用), 找到一个活的就复制一个开辟的那块内存空间,并修正引用,新的空间里对象是紧密相连的。

      以上两种凡是都要在程序暂停的时候才运行

      JVM会进行监视如果所有的对象都很稳定,垃圾回收器的效率降低的话,那么就会切换到"标记--清除"方式;通用会跟踪"标记- -清除"的效果,如果要是出现了很多空间碎片的话,就要切换回到"停止--复制"的方式.

       

      停止--复制>>>对象稳定效果降低>>>标记--清除>>>空间碎片产生的太多>>>停止--复制>>>

        这就是”自适应“技术


        
      JVM中有许多附加技术用于提升速度,尤其是与加载器操作相关的,被称为”(Just-In-Time,JIT)即使编译器“的技术

        它可以把程序全部或部分编译成本机机器码(本来是JVM做的事情),用于提升速度

        当需要装载某个类时,会找到其class文件,然后将该类的字节码装入内存。这里有两个方案

        1. 全部编译:但需要花费更多的时间,并会增长可执行代码的长度。

        2. 惰性评估:在必要时才会编译

        现版本的JDK中,代码每次执行都会得到优化,执行的次数越多那么速度也就越快

        【上篇】
        【下篇】

        抱歉!评论已关闭.