Java内存管理之基础概念——GC(Garbage Collection)的基本概念

Java内存管理之基础概念——GC(Garbage Collection)的基本概念

2009年6月26日 admin 发表评论 阅读评论
 

这是Java内存管理系列文章的第一篇。

GC的概念

GC是一种自动内存管理程序,与之相对应的是C++采用的内存管理方式。GC主要的职责就是分配内存;保证被引用的对象始终在内存中;把不被应用的对象从内存中释放。被引用的对象称之为Live 对象;不被引用的对象就是Dead对象,是需要回收的。任何事物都有光面和黑暗两面,原因很简单GC是一个很复杂的东西:-)。

GC会自动计算对象被引用的情况,只要对象不在被引用,相应的内存就会被回收,而C++中需要开发人员通过代码来“显示”地回收内存,如果程序员没有回收就会导致内存的泄露(内存泄露的原因有很多种这只是其中一个)。C++中还有经常出现的一个问题是一个对象在还有其他引用存在的情况下,就被程序给回收了,导致其他引用访问该对象时出现严重错误。另外,GC非常重要的一点就避免内存碎片,道理跟windows的磁盘整理一样,把使用中各个内存块整合起来,这样才能保证有足够的空间来存储大对象。

理想的GC

一个理想的GC要能够满足以下几点:

  • 该回收的回收,不改回收的绝不回收
  • GC要快而且GC运行的时候不能导致应用程序的停顿。
  • 限制内存碎片,对象被回收以后,所使用的内存会被回收,如果不加处理内存中就会出现大量的内存碎片,这样就有可能导致因为没有足够的连续空间分配给某些大对象而导致OutofMemory。消除内存碎片的的手段之一就是“内存压缩”。
  • 可扩展性(Scalability),内存的分配和回收都不能成为应用程序的瓶颈。

GC的设计选择

  • 串行回收(Serial)VS并行回收(Parallel)。串行就是不管有多少个CPU,始终只有一个CPU用来执行回收操作,而并行就是把整个回收工作拆分成多个,由多个CPU同时执行。并行回收执行会快,但复杂度增加,另外也有其他一些副作用,比如内存碎片会增加。
  • 并发执行(Concurrent)VS应用程序停止(Stop-the-world)。Stop-the-world的GC方式在执行GC的同时会导致应用程序的暂停。并发执行的GC虽然不会导致应用程序的暂停,但由于并发执行GC要解决和应用程序的执行冲突(应用程序可能会在GC的过称中修改对象),并发执行GC执行的消耗会高于Stop-the-world,而且执行也需要更多的内存堆。
  • 压缩(Compacting)VS不压缩(Non-compacting)VS拷贝(Copying)。为了减少内存碎片,支持压缩的GC会把所有的活对象搬迁到一起,然后将之前占用的内存全部回收。不压缩式的GC顾名思义就是在GC的过程中不压缩内存,较之压缩式的GC,不压缩式的GC回收内存快了,而分配内存慢了,而且无法解决内存碎片的问题。拷贝式的GC会将活对象拷贝到不同的内存区域中,这种方式的优点是源数据可以被认为已经清空并可以用来分配,缺点也很明显,需要拷贝数据和额外的内存。

GC的性能评判标准

  • 生产力(Throughput)—全部时间中不用于GC的比例。
  • GC的开销—全部时间中用于GC的比例。
  • 暂停时间—GC过程中应用程序执行暂停的时间。
  • GC的频率—通过跟应用程序的执行比较来得到GC的执行频率。
  • 支持GC运行所需使用的内存大小—例如heap的大小。
  • GC的及时性(Promptness)—一个对象从被废弃到内存被回收之间的时间差。

参考资料

Memory Management in the Java HotSpot Virtual
 

转自:http://www.daniel-journey.com/archives/97

你可能感兴趣的:(java,jvm)