• 总结Java垃圾回收器的方法和原理


    1. 垃圾回收只与内存有关

    在Java中,我们new完对象之后,垃圾回收器负责回收无用的对象占据的内存资源。这与C++不同,在C++中,准许使用局部对象,回收对象时候,需要用到finalize()析构函数。C++的对象创建在堆栈中,而Java对象创建在堆中,所以我们创建完对象之后,Java的垃圾回收器在堆中,会自动帮我们回收垃圾,至于何时回收垃圾,我们不得而知了。

    2.垃圾回收用到的方法

    (1)finalize()

    该方法是用来回收“特殊”的内存,而这内存不是new出来的,所以垃圾回收器无法回收。这种情况主要发生在使用“本地方法”的情况下,本地方法是一种在Java中使用的非Java代码,可以调用任何代码,但只能被C和C++调用。所以我们使用finalize()来释放本地方法产生的内存。

    (2)System.gc()

    该方法不推荐,严重消耗性能,除非万不得已,一般不用。

    3.Java垃圾回收器工作

    当垃圾回收器工作时候,它一面回收空间,一面是堆中的对象重新排列。通过对堆中的对象重新排列,实现了一种高速的、无限空间的可供分配的堆模型。

    4. 简单的垃圾回收技术:引用计数

    引用计数:每个对象都有一个引用计数器,当有引用连接至对象时,引用计数器自动加1,当引用离开作用域或被置为null时,引用计数器减1,当对象的引用计数器为0时候,JVM会将对象回收。该方法需要在每一个对象上设置引用计数器,效率很低,而且在对象间循环引用时候,效果不好。

    5.Java垃圾回收器的工作机制。

    Java虚拟机采取了一种自适应的垃圾回收技术。

    停止-复制:先暂停程序(它不属于后台回收模式),然后将所有存活的对象从当前的堆中复制到另一个堆中,没有复制的对象就是垃圾,而被复制到新堆中的对象会紧凑的排列。

    标记-清扫:遍历所有引用,进而找出多有存活的对象。当没找到一个存活的对象,就会给对象标记,这个过程中不会清理任何对象。只有全部标记完成之后,才会清理垃圾。

    在Java虚拟机运行过程中,如果所有对象稳定,垃圾回收器效率降低的话,就会切换到"标记-清扫";同意,Java虚拟机会跟踪"标记-清扫"效果,要是堆空间出现很多碎片,就会切换到”停止-复制“;

    6.Java提升速度的技术:JIT

    JIT:just-in-time,及时编辑技术。该技术可以把程序翻译成为本地机器码。在JDK中,会智能的将一些经常使用的.class文件,编译成字节码装入内存,因此Java的执行速度会得到提升。

  • 相关阅读:
    1137 Final Grading (25 分)
    1136 A Delayed Palindrome (20 分)
    1135 Is It A Red-Black Tree (30 分)
    1134 Vertex Cover (25 分)
    1133 Splitting A Linked List (25 分)
    1074 Reversing Linked List (25 分)
    1132 Cut Integer (20 分)
    HDU 3342 Legal or Not
    IDEA解决JSP页面无法使用EL表达式问题
    25. Bootstreap 下拉菜单
  • 原文地址:https://www.cnblogs.com/xumaodun/p/4876110.html
Copyright © 2020-2023  润新知