JasonWang's Blog

Java中的垃圾回收机制

Java将所有运行时的分配的对象保存到堆(heap)中,虚拟机通过诸如new,newarray,anewarray以及multianewarray等指令来分配对象,但并不会在代码中显式的释放这些内存区域,而是由虚拟机中自带的内存回收器(Garbage Collection,以下简称GC)来负责内存分配、压缩以及回收。GC的主要任务就是找到堆中那些不再被引用的内存对象,将其回收用于分配新的对象;同时,GC还要负责压缩堆内存分片,减少内存碎片,确保新的对象有足够的连续空间可以使用。GC让开发人员不用再担心内存释放的问题,提升了开发效率;在另外一个方面,GC使开发人员不用再担心错误的释放了某个对象,确保了程序的完整性。但使用GC的一个潜在弊端是,GC在收集内存时会增加程序负担,减低程序运行效率。

接下来,就来看看Java虚拟机中常用的垃圾回收算法。

垃圾收集算法

任何垃圾收集算法都需要做如下几件事情:

  • 检测需要回收的对象;
  • 回收“垃圾”对象所占用的内存,将这些内存提供给程序使用;
  • 对内存进行去碎片化处理;
Java虚拟机入门

Java诞生于互联网兴盛的上世纪90年代,为了在不同终端设备上运行Java程序,其在设计之初,就考虑到了语言的可移植性,确保编写完后,可以在任何平台上运行。随着互联网时代的来临,Java因其平台无关性(platform independence), 安全性(security)、网络可移动性(network mobility)以及内存自动管理(Garbage Collection)等特征而得到了广泛的应用。那么, Java的这些特性究竟是如何实现的?相比早前的C/C++等编译型语言,Java程序首先被编译成一个个包含了字节码(bytecode)的.class文件,运行时,.class文件被加载Java虚拟机(Java Virtual Machine)上执行。实际上,任何其他语言只要能够编译成JVM能够识别的bytecode, JVM都可以执行