zoukankan      html  css  js  c++  java
  • 总结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的执行速度会得到提升。

  • 相关阅读:
    GYM 101128 J.Saint John Festival(求凸包是否包含点)
    GYM 101128 F.Landscaping(网络流)
    ACM ICPC 2017 Warmup Contest 2 I. Integral Polygons(计算几何+动态规划)
    ACM ICPC 2017 Warmup Contest 1 A. Artwork(逆向+dfs+并查集)
    51nod 1225 余数之和(数论)
    51nod 1397 最大二分图(图论+思维)
    51nod 1444 破坏道路(任意两点最短路径)
    网络流24题——孤岛营救问题(状压+分层图)
    ACM 竞赛高校联盟 练习赛 第六场 光头强的强迫症(线段树)
    bzoj1577 [USACO09FEB] Fair Shuttle
  • 原文地址:https://www.cnblogs.com/xumaodun/p/4876110.html
Copyright © 2011-2022 走看看