深入浅出Java堆的管理--垃圾回收

嗨宝Ec

嗨宝Ec

2016-02-19 16:00

今天图老师小编要向大家分享个深入浅出Java堆的管理--垃圾回收教程,过程简单易学,相信聪明的你一定能轻松get!

      引言

      Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。 !-- frame contents -- !-- /frame contents -- Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new、newarray、anewarray和multianewarray等指令建立,但是它们不需要程序代码来显式地释放。一般来说,堆的是由垃圾回收 来负责的,尽管JVM规范并不要求非凡的垃圾回收技术,甚至根本就不需要垃圾回收,但是由于内存的有限性,JVM在实现的时候都有一个由垃圾回收所治理的堆。垃圾回收是一种动态存储治理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能。

      垃圾收集的意义

      在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象;而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。垃圾收集意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放没用的对象,垃圾收集也可以清除内存记录碎片。由于创建对象和垃圾收集器释放丢弃对象所占的内存空间,内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆的一端,JVM将整理出的内存分配给新的对象。

      垃圾收集能自动释放内存空间,减轻编程的负担。这使Java 虚拟机具有一些优点。首先,它能使编程效率提高。在没有垃圾收集机制的时候,可能要花许多时间来解决一个难懂的存储器问题。在用Java语言编程的时候,靠垃圾收集机制可大大缩短时间。其次是它保护程序的完整性, 垃圾收集是Java语言安全性策略的一个重要部份。

      垃圾收集的一个潜在的缺点是它的开销影响程序性能。Java虚拟机必须追踪运行程序中有用的对象, 而且最终释放没用的对象。这一个过程需要花费处理器的时间。其次垃圾收集算法的不完备性,早先采用的某些垃圾收集算法就不能保证100%收集到所有的废弃内存。当然随着垃圾收集算法的不断改进以及软硬件运行效率的不断提升,这些问题都可以迎刃而解。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

      垃圾收集的算法分析

      Java语言规范没有明确地说明JVM使用哪种垃圾回收算法,但是任何一种垃圾收集算法一般要做2件基本的事情:(1)发现无用信息对象;(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用。

      大多数垃圾回收算法使用了根集(root set)这个概念;所谓根集就量正在执行的Java程序可以访问的引用变量的集合(包括局部变量、参数、类变量),程序可以使用引用变量访问对象的属性和调用对象的方法。垃圾收集首选需要确定从根开始哪些是可达的和哪些是不可达的,从根集可达的对象都是活动对象,它们不能作为垃圾被回收,这也包括从根集间接可达的对象。而根集通过任意路径不可达的对象符合垃圾收集的条件,应该被回收。下面介绍几个常用的算法。

      1、引用计数法(Reference Counting Collector)

      引用计数法是唯一没有使用根集的垃圾回收得法,该算法使用引用计数器来区分存活对象和不再使用的对象。一般来说,堆中的每个对象对应一个引用计数器。当每一次创建一个对象并赋给一个变量时,引用计数器置为1.当对象被赋给任意变量时,引用计数器每次加1.当对象出了作用域后(该对象丢弃不再使用),引用计数器减1,一旦引用计数器为0,对象就满足了垃圾收集的条件。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

      基于引用计数器的垃圾收集器运行较快,不会长时间中断程序执行,适宜地必须 实时运行的程序。但引用计数器增加了程序执行的开销,因为每次对象赋给新的变量 ,计数器加1,而每次现有对象出了作用域生,计数器减1.

      2、tracing算法(Tracing Collector)

      tracing算法是为了解决引用计数法的问题而提出,它使用了根集的概念。基于tracing算法的垃圾收集器从根集开始扫描,识别出哪些对象可达,哪些对象不可达,并用某种方式标记可达对象,例如对每个可达对象设置一个或多个位。在扫描识别过程中,基于tracing算法的垃圾收集也称为标记和清除(mark-and-sweep)垃圾收集器。

      3、compacting算法(Compacting Collector)

      为了解决堆碎片问题,基于tracing的垃圾回收吸收了Compacting算法的思想,在清除的过程中,算法将所有的对象移到堆的一端,堆的另一端就变成了一个相邻的空闲内存区,收集器会对它移动的所有对象的所有引用进行更新,使得这些引用 在新的位置能识别原来 的对象。在基于Compacting算法的收集器的实现中,一般增加句柄和句柄表。

  

展开更多 50%)
分享

猜你喜欢

深入浅出Java堆的管理--垃圾回收

编程语言 网络编程
深入浅出Java堆的管理--垃圾回收

Java堆的管理--垃圾回收

Java JAVA基础
Java堆的管理--垃圾回收

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

深入浅出 CPropertySheet

C语言教程 C语言函数
深入浅出 CPropertySheet

Singleton深入浅出

电脑网络
Singleton深入浅出

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

深入浅出Java的访问者模式

编程语言 网络编程
深入浅出Java的访问者模式

深入浅出基于Java的代理设计模式

编程语言 网络编程
深入浅出基于Java的代理设计模式

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

start.exe是什么进程

start.exe是什么进程

深入浅出Java设计之备忘录模式

深入浅出Java设计之备忘录模式
下拉加载更多内容 ↓