收集器
JVM通过GC来回收堆和方法区的内存,GC的基本原理首先会找到程序中不再被使用的对象,然后回收这些对象所占用的内存,通常采用收集器的方式实现GC,主要的收集器有引用计数收集器和跟踪收集器。
1、引用技术收集器
引用计数器在每次的对象赋值是进行引用计数器的加减,它有一定的消耗。另外,引用计数器对于循环的场景没有方法实现回收。(不用)
2、跟踪收集器
跟踪收集器采用的为集中式的管理方式,全局记录数据的引用状态。基于一定条件的触发(例如定时。空间不足时),执行时需要从根集合来扫描对象的引用关系,这可能造成程序的暂停,主要有复制(copying)、标记-清除(Mark-Sweep)和标记-压缩(Mark-Compact)三种实现算法。
复制
复制采用的方式为从根集合扫描出存活的对象,并将找到的存活对象复制到一块新的完全未使用的空间中。
复制收集器方式仅需从跟集合扫描所有存活的对象,当要回收的空间中存活对象比较少时,复制算法会比较高效,其带来的成本是要增加一块内存空间进行对象的移动。
标记-清除
标记-清除采用的方式为从跟集合开始扫描,对存活的对象进行标记,标记完毕后,再扫描整个空间中未被标记的对象,并进行回收。
标记-清除动作不需要进行对象的移动,且仅对其不存活的对象进行处理。在空间中存活的对象较多的情况下较为高效,但由于标记-清除采用的为直接回收不存活对象所占用的内存,因此会造成内存碎片。
标记-压缩
标记-压缩采用和标记-清除一样的方式对存活的对象进行标记,但在清除时则不同。在回收不存活对象所占用的内存空间后,会将其他所有存活对象都往左端空闲的空间进行移动,并更新引用其对象的指针。
标记-压缩在标记-清除的基础上还须进行对象的移动,成本相对更高,好处则是不产生内存碎片。
SUN JDK中可用的GC
SUN JDK根据运行的Java程序进行分析,认为程序中大部分对象的存活时间都是较短的,少部分对象是长期存活的。基于这个分析,SUN JDK将JVM堆划分了新生代和旧生代,并基于新生代和旧生代中对象存活时间的特征提供了不同的GC实现。
根集合对象:当前运行线程的栈上引用的对象、常量及静态变量、传到本地方法中,还没有被 本地方法释放的对象引用。
如果Minor GC仅从以上这些根集合对象中扫描新生代的存活对象,则当旧生代中的对象引用了新生代的对象是会出现问题,但旧生代通常比较大。为了提高性能,不可能每次Minor GC的时候去扫描整个旧生代,SUN JDK采用了remember set的方式来解决这个问题。
SUN JDK在进行对象赋值时,如果发现赋值的为一个对象引用,则产生write barrier,然后检查需要赋值的对象是否在旧生代及赋值的对象引用是否指向新生代:如果满足条件,则在remember set做个标记,SUN JDK采用了Card Table来实现remember set。
新生代可用的GC:串行GC(serial gc)、并行回收GC(Parallel Scavenge)、并行GC(ParNew)
旧生代和持久代可用GC:串行、并行、并发
分享到:
相关推荐
本程序"MemoryCollectTest"旨在帮助开发者理解和实践如何在C#中强制触发内存回收。 首先,我们需要了解.NET内存管理的基本概念。.NET中的内存分为堆和栈两部分。栈主要用于存储基本类型和引用,而堆则用于存储对象...
本文将深入探讨"IIS站点内存回收导致Session被清空"的问题,并提供相应的解决方案。 IIS(Internet Information Services)是微软提供的一个用于发布Web内容的服务器平台。在运行过程中,IIS通过应用程序池...
不过,既然标题是“安卓kernel 内存回收机制”,那么我可以根据这个主题,详细说明安卓内核内存回收机制的知识点。 安卓操作系统是基于Linux内核构建的,Linux内核具有强大的内存管理能力,安卓系统在此基础上...
### 深入理解.NET内存回收机制 #### 一、引言 在.NET框架中,内存管理是一项核心功能,它负责自动地管理应用程序所使用的内存资源。与传统的手动内存管理方式(如C++中的new/delete操作)不同,.NET通过引入垃圾...
本文将深入探讨C++中的内存管理,包括内存回收、内存泄漏以及相关的检测工具。 首先,我们要理解C++的内存层次结构,主要包括栈内存(Stack)、堆内存(Heap)、静态存储区(Static)和常量存储区(ReadOnly)。栈...
为了解决这些问题,一些高级语言如Java和Python提供了自动内存回收机制,即垃圾回收(Garbage Collection)。在C++中,虽然没有内置的垃圾回收机制,但可以通过特定的设计模式和库来实现类似的功能。 《The Art of ...
本篇文章将深入探讨“操作系统内存回收与分配”这一主题,帮助读者理解这一核心概念。 内存分配是指在程序运行时为它分配所需的内存空间,而内存回收则是指当程序结束或不再需要某块内存时,将其归还给系统以便再次...
VC 内存操作:内存回收及分配空间的实例代码,根据运行后所返回的信息,可看出程序再分配内存后,又重新收回了内存,从分配到释放的一个过程,先处理剩余空间然后修改原来的节点信息,把剩余的空间化为一个节点并连...
"系统内存回收软件"就是针对这一需求而设计的工具,其主要目的是提高计算机运行效率,特别是对于那些配置较低的老式电脑,这类软件能显著提升用户体验。 首先,我们需要理解内存(RAM)在计算机中的作用。内存是...
.NET内存回收机制是.NET框架核心组成部分之一,主要负责管理应用程序的内存分配和释放,从而避免内存泄漏问题。这一机制由垃圾回收器(Garbage Collector,简称GC)执行,使得程序员无需手动管理内存,提高了开发...
这种方式提高了内存利用率,但也引入了内存回收的问题,即如何有效地释放不再使用的内存以供后续使用。 内存回收主要关注四个基本情况: 1. **内存分配后未使用**:程序分配了内存但未实际使用,这部分内存应当被...
C# 内存回收C# 内存回收C# 内存回收C# 内存回收C# 内存回收
### 动态内存分配以及内存回收算法的实现 #### 实验背景与意义 在现代计算机系统中,内存管理是一项至关重要的任务。合理的内存管理不仅能够提高系统的运行效率,还能够确保程序的稳定性和安全性。本实验旨在通过...
本文将围绕“Flash强制垃圾内存回收测试”这一主题进行深入探讨,结合提供的标签“源码”和“工具”,我们将讨论Flash平台上的内存管理机制,特别是如何进行垃圾回收(Garbage Collection, GC)以及如何通过源码进行...
Java的内存回收, 及时的回收内存资源,更有利于程序的稳定性
在内存回收方面,我们需要将已分配给进程的内存块回收到空闲区表中,并合并相邻的空闲内存块,以减少碎片的产生。为了实现这一任务,我们需要维护着一个已分配分区表,记录着所有已分配给进程的内存块的信息。 实验...
Java虚拟机(JVM)的内存回收,也称为垃圾收集(GC),是Java语言特性的重要组成部分,用于自动管理内存,释放不再使用的对象所占用的空间。虽然Java语言本身并不强制要求JVM实现GC,但现代JVM如Oracle的HotSpot JVM...