GC为什么影响程序效率

java垃圾回收机制 早期的jvm使用引用计数,现在大多数jvm采用对象引用遍历。对象引用遍历从一组对 象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对 象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。在对象遍历阶段, gc必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。下一步,gc要删除不可到达的对象。删除时,有些gc只是简单的扫描堆栈,删除未标 记的对象,并释放它们的内存以生成新的对象,这叫做清除(sweeping)。这种方法的问 题在于内存会分成好多小段,而它们不足以用于新的对象,但是组合起来却很大。因此,许 多gc可以重新组织内存中的对象,并进行压缩(compact),形成可利用??空间。 为此,gc需要停止其他的活动。这种方法意味着所有与应用程序相关的工作停止,只有 gc运行。结果,在响应期间增减了许多混杂请求。另外,更复杂的gc不断增加或同时运行 以减少或者清除应用程序的中断。有的gc使用单线程完成这项工作,有的则采用多线程以 增加效率
用户Java程序运行过程中,Java虚拟机提供了另外一个系统级的线程,专门负责回收不再被使用的对象占用的内存,这一过程称为垃圾回收。
垃圾回收需要对堆内存中的对象进行标记,并对堆内存进行整理。这一过程的某些阶段需要暂时终止用户Java线程,等回收工作完成后再恢复执行。
因此,频繁地触发虚拟机垃圾回收操作的行为会影响程序的运行效率。
那么什么情况下会频繁地出发垃圾回收操作呢?
- 比如:堆内存设置过小
- 再比如:程序频繁地分配大型局部对象数组

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