• jvm的垃圾回收原理


    什么是垃圾回收?

    垃圾回收是Java中自动内存管理的另一种叫法。垃圾回收的目的是为程序保持尽可能多的可用堆(heap)。 JVM会删除堆上不再需要从堆引用的对象。

    用一个例子解释垃圾回收?

    比方说,下面这个方法就会从函数调用。

    void method(){
        Calendar calendar = new GregorianCalendar(2000,10,30);
        System.out.println(calendar);
    }

    通过函数第一行代码中参考变量calendar,在堆上创建了GregorianCalendar类的一个对象。

    函数结束执行后,引用变量calendar不再有效。因此,在方法中没有创建引用到对象。

    JVM认识到这一点,会从堆中删除对象。这就是所谓的垃圾回收。

    什么时候运行垃圾回收?

    垃圾回收在JVM突发奇想和心血来潮时运行(没有那么糟糕)。运行垃圾收集的可能情况是:

    • 堆可用内存不足

    • CPU空闲

    垃圾回收的最佳做法?

    用编程的方式,我们可以要求(记住这只是一个请求——不是一个命令)JVM通过调用System.gc()方法来运行垃圾回收。

    当内存已满,且堆上没有对象可用于垃圾回收时,JVM可能会抛出OutOfMemoryException。

    对象在被垃圾回收从堆上删除之前,会运行finalize()方法。我们建议不要用finalize()方法写任何代码。

     

    注意:finalize()

    System.gc();只是告诉jVM这些东西不用了,请帮忙回收。JVM不会立刻去进行回收

    java垃圾回收器是负责回收无用对象占据的内存资源的,但是由于垃圾回收器只知道释放那些经由new分配的内存,对其他未使用new分配的内存空间则无能为力。针对此情况,Java允许在类中定义一个名为finalize()的方法。

    其工作原理:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以如果用finalize()就能在垃圾回收时刻做一些重要的清理工作。而System.gc()则是启动一个垃圾回收器,在释放new分配内存空间之前,将会通过finalize()释放用其他方法分配的内存空间(如本地方法调用C中用new分配的内存空间)

  • 相关阅读:
    关于import和from xx import xx
    Python中import机制
    定制化的IPython配置
    ajax请求封装函数
    ajax-----readyState总结
    console控制台的小问题
    http协议基本知识
    cookie猜数字游戏(下)------------以及cookie使用的不安全之处
    cookie猜数字游戏(上)---------------思路分析(踩坑)
    Cookie隐藏小广告
  • 原文地址:https://www.cnblogs.com/wanghongye/p/5239370.html
Copyright © 2020-2023  润新知