下载此文档

Java垃圾回收与回收机制.doc


文档分类:IT计算机 | 页数:约13页 举报非法文档有奖
1/13
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/13 下载此文档
文档列表 文档介绍
全面分析 Java 的垃圾回收机制 Java 的堆是一个运行时数据区,类的实例( 对象) 从中分配空间。 Java 虚拟机(JVM) 的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过 new 、 newarray 、 anewarray 和 multianewarray 等指令建立,但是它们不需要程序代码来显式地释放。一般来说,堆的是由垃圾回收来负责的,尽管 JVM 规范并不要求特殊的垃圾回收技术,甚至根本就不需要垃圾回收, 但是由于内存的有限性, JVM 在实现的时候都有一个由垃圾回收所管理的堆。垃圾回收是一种动态存储管理技术, 它自动地释放不再被程序引用的对象, 按照特定的垃圾收集算法来实现资源自动回收的功能。垃圾收集的意义在 C++ 中, 对象所占的内存在程序结束运行之前一直被占用, 在明确释放之前不能分配给其它对象;而在 Java 中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。 JVM 的一个系统级线程会自动释放该内存块。垃圾收集意味着程序不再需要的对象是" 无用信息", 这些信息将被丢弃。当一个对象不再被引用的时候, 内存回收它占领的空间, 以便空间被后来的新对象使用。事实上, 除了释放没用的对象, 垃圾收集也可以清除内存记录碎片。由于创建对象和垃圾收集器释放丢弃对象所占的内存空间,内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆的一端, JVM 将整理出的内存分配给新的对象。垃圾收集能自动释放内存空间,减轻编程的负担。这使 Java 虚拟机具有一些优点。首先, 它能使编程效率提高。在没有垃圾收集机制的时候, 可能要花许多时间来解决一个难懂的存储器问题。在用 Java 语言编程的时候,靠垃圾收集机制可大大缩短时间。其次是它保护程序的完整性, 垃圾收集是 Java 语言安全性策略的一个重要部份。垃圾收集的一个潜在的缺点是它的开销影响程序性能。 Java 虚拟机必须追踪运行程序中有用的对象, 而且最终释放没用的对象。这一个过程需要花费处理器的时间。其次垃圾收集算法的不完备性,早先采用的某些垃圾收集算法就不能保证 100% 收集到所有的废弃内存。当然随着垃圾收集算法的不断改进以及软硬件运行效率的不断提升, 这些问题都可以迎刃而解。垃圾收集的算法分析 Java 语言规范没有明确地说明 JVM 使用哪种垃圾回收算法,但是任何一种垃圾收集算法一般要做 2 件基本的事情:(1) 发现无用信息对象;(2) 回收被无用对象占用的内存空间,使该空间可被程序再次使用。大多数垃圾回收算法使用了根集(root set) 这个概念;所谓根集就量正在执行的 Jav a 程序可以访问的引用变量的集合( 包括局部变量、参数、类变量), 程序可以使用引用变量访问对象的属性和调用对象的方法。垃圾收集首选需要确定从根开始哪些是可达的和哪些是不可达的, 从根集可达的对象都是活动对象, 它们不能作为垃圾被回收, 这也包括从根集间接可达的对象。而根集通过任意路径不可达的对象符合垃圾收集的条件, 应该被回收。下面介绍几个常用的算法。 1、引用计数法(Reference Counting Collector) 引用计数法是唯一没有使用根集的垃圾回收的法,该算法使用引用计数器来区分存活对象和不再使用的对象。一般来说, 堆中的每个对象对应一个引用计数器。当每一次创建一个对象并赋给一个变量时, 引用计数器置为 1。当对象被赋给任意变量时, 引用计数器每次加1 当对象出了作用域后( 该对象丢弃不再使用) ,引用计数器减 1 ,一旦引用计数器为 0, 对象就满足了垃圾收集的条件。基于引用计数器的垃圾收集器运行较快, 不会长时间中断程序执行, 适宜地必须实时运行的程序。但引用计数器增加了程序执行的开销, 因为每次对象赋给新的变量, 计数器加 1 ,而每次现有对象出了作用域生,计数器减 1。 2、 tracing 算法(Tracing Collector) tracin g 算法是为了解决引用计数法的问题而提出, 它使用了根集的概念。基于 tracin g 算法的垃圾收集器从根集开始扫描, 识别出哪些对象可达, 哪些对象不可达, 并用某种方式标记可达对象, 例如对每个可达对象设置一个或多个位。在扫描识别过程中, 基于 tracin g 算法的垃圾收集也称为标记和清除(mark-and-sweep) 垃圾收集器. 3、 compacting 算法(Compacting Collector) 为了解决堆碎片问题, 基于 tracing pacting 算法的思想, 在清除的过程中, 算法将所有的对象移到堆的一端, 堆的另一端就变成了一个相邻的空闲内存区, 收集器会对它移动的所有对象的所有引用进行更新,使得这些引

Java垃圾回收与回收机制 来自淘豆网m.daumloan.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数13
  • 收藏数0 收藏
  • 顶次数0
  • 上传人yzhlyb
  • 文件大小0 KB
  • 时间2016-07-14