一、垃圾收集算法
1、最常见的判断对象是否存活的方法有引用计数法和根搜索算法。
(1) 引用计数法中,每一个对象都有一个引用计数器,当它被引用时,计数器+1,当一个引用释放时,计数器的值-1。引用计数法的特点是简单、高效,但是它解决不了对象间互相引用的问题。
(2) 根搜索算法:从根集合出发,根据引用关系,不断地往下搜索。搜索路径就构成了引用链,在引用链上的对象都是存活对象。而根集合通过引用链到达不了的对象(从图论的角度看,即是不可达的对象),就是不会再被使用的对象,可以被回收。
根集合包含的范围有:
① 虚拟机栈中的引用对象(栈帧中的本地变量表)。
② 方法区中的常量池中的引用对象(包括类静态属性引用对象、常量属性引用对象)。
③ 本地方法栈中引用的对象。
2、垃圾收集算法
1) 复制算法
将内存划分为同样大小的两份,每一次都只使用其中的一块内存,进行垃圾回收时,将该内存中存活的对象复制到另一块备用内存中,然后清除该块内存,作为下次垃圾回收时的备用内存。
2) 标记-清除法
每一次垃圾回收时,先将非存活对象标记,然后将这些非存活对象从内存中清除。此方法会产生空间碎片。
3) 标记-整理法
该方法在标记-清除的基础上,增加了整理步骤。每一次垃圾回收时,先将非存活对象标记,然后将这些对象从内存中清除,最后再将存活对象向内存的一端移动。避免产生大量的空间碎片。
二、Java虚拟机规范中内存区域划分
1、在Java虚拟机规范中,将内存区域划分为:
① Java虚拟机栈
每一个线程都在该区域创建一个栈,栈中包含栈帧(一般的,一个方法对应一个栈帧),栈帧中包含了本地变量表、操作数栈、动态链接,其他栈帧信息等。
② 本地方法栈
本地方法栈与Java虚拟机栈类似,在Sun Spot的虚拟机实现中,该区域与Java虚拟机栈合并在一起。
③ 方法区
方法区中存放了与类有关的信息,比如类的名字,全限定名,继承的父类,实现的接口,属性等。
④ 程序计数器
指示当前执行的和下一条要执行的指令的位置。(字节码流中字节的相对偏移量)。
⑤ 堆
实例化的对象都是放在这个区域。进行垃圾回收的主要区域。
2、Sun Spot的虚拟机实现中,堆中区域细分
a) 新生代。新生代又细分为Eden、Survivor1和Survivor2;
b) 老年代(或称旧生代)
三、垃圾收集器
1、新生代上的垃圾收集器
a) Serial收集器
i. 串行收集器(单线程收集器),只有一个线程进行垃圾回收,当进行垃圾回收时,要将所有用户线程暂停。该收集器采用复制算法回收垃圾。
b) ParNew收集器
i. 并行收集器,收集器采用多线程同时进行垃圾回收,但是当进行垃圾回收时,也要将所有用户线程暂停。采用复制算法回收垃圾。
c) Parallel Scavenger收集器
i. 并行回收收集器,与ParNew收集器一样是多线程的,但是它的侧重点与ParNew不同,Parallel Scavenger注重的是吞吐量(用户程序占用CPU的时间与CPU总运行时间的比,[用户程序执行时间/(用户程序执行时间+垃圾回收执行时间)]),所以又称“吞吐量优先收集器”。采用复制算法回收垃圾。
2、老年代上的垃圾收集器
a) Serial Old收集器
i. 因为采用“标记-整理”算法进行垃圾回收,所以又称MSC(Mark-Sweep-Compact)收集器。串行回收垃圾,进行垃圾回收时,会暂停所有用户线程。
b) Parallel Old收集器
i. 它是Parallel Scavenger的老年版本,属于多线程收集器,采用标记-整理算法。在回收垃圾时,也会暂停用户线程。
c) CMS收集器
i. 并发收集器,采用“标记-整理”算法进行垃圾回收。CMS收集器的垃圾回收线程可以跟用户线程并发执行。
ii. 垃圾回收包含四个阶段:
1. 初始标记:标记一下GC Roots可以直接关联到的对象,需要暂停用户线程,但是该过程速度很快;
2. 并发标记:进行根搜索的过程,与用户程序并发运行;
3. 重新标记:因为在并发标记的时候,用户程序和并发标记时同时进行的(单CPU条件下交替执行),为了修正并发标记期间,因用户程序继续运行而导致标记变动的那部分对象的标记记录。该阶段需要暂停用户线程。
4. 并发清除:清除垃圾对象,该过程与用户程序并发运行。
四、内存分配与回收策略
简要介绍几种基本的内存分配与回收策略。
1. 对象优先分配在Eden区域
在程序运行时,大部分对象都是朝生夕死的。将新创建的对象存放在新生代的Eden区域,那些存活期短的对象很快就可以被回收掉,有利于快速、高效地回收利用有限的内存。
2. 大对象直接分配在老年代
将大对象(比如说大数组)直接分配在老年代,是考虑到如果大对象分配在新生代而此时对象的存活期较长,那么新生代收集器采取复制算法进行垃圾回收时,复制大对象的成本将会很高(显然大对象的复制时间会比较长)。
3. 长期存活对象将进入老年代
某一个对象在每一次执行Minor GC(新生代垃圾回收)都能存活下来,即这个对象的存活时间比较长,那么在每一次Minor GC时它都会从From Survivor复制到To Survivor,为了避免长期存活的对象一次次的被复制,JVM采取的策略是在每一次Minor GC后存活下来的对象的年龄就增加一岁,当它的年龄增加到一定程度时,就会被晋升到老年代中。
4. 动态对象年龄判定
为了更好地适应不同程序的运行,虚拟机并不总是要求对象存活年龄达到某一阈值才晋升到老年代中。动态对象年龄判定策略指的是:当Survivor区域中某一年龄的所有对象占Survivor区域的一半以上时,该年龄以及该年龄以上的对象将直接晋升到老年代中。
分享到:
相关推荐
在编程领域,尤其是在C/C++中,动态内存分配与回收是一项关键技能,它涉及到程序运行时内存的管理和优化。动态内存分配允许程序在运行时根据需要请求和释放内存,而不是在编译时就预设固定的内存空间。这使得程序...
内存分配与回收是操作系统中关键的功能,确保程序的高效运行和内存的合理利用。在本项目中,我们将探讨如何使用C语言来模拟这个过程。 C语言是一种底层编程语言,非常适合用于实现操作系统级别的功能。它提供了直接...
#### 四、内存回收与合并 当进程结束并释放内存时,操作系统需要能够有效地回收这些内存空间,并且在可能的情况下将相邻的空闲分区合并,以减少内存碎片。 - **回收过程**:当进程结束时,其占用的内存区域将被标记...
本主题将深入探讨“内存分配与回收模拟”,包括first fit、worst fit这两种策略,以及如何将它们扩展到best fit和next fit。 首先,我们来理解内存分配的基本概念。内存分配是指为进程或数据结构在主内存中划分空间...
内存分配与回收是操作系统管理计算机内存的关键环节,对于优化系统性能和防止资源浪费至关重要。本实验报告主要关注连续式分配和分页式管理这两种内存管理方式,并通过编程模拟这两种方式下的内存分配与回收过程。 ...
内存分配与回收是计算机编程中的核心概念,尤其是在C++这种低级语言中,程序员需要直接管理内存。本文将深入探讨这两个主题,通过实例代码来帮助理解它们的艺术。 内存分配是程序运行时为变量、对象或数据结构预留...
内存分配与回收是操作系统中内存管理的核心任务,涉及如何有效地分配内存给进程以及在进程结束或需要更多资源时如何回收内存。本实验报告将详细探讨这两个概念,并通过具体的操作演示来加深理解。 一.实验目的: 1...
本项目将详细探讨并模拟该算法在内存分配与回收过程中的实现。 首次适应算法的基本思想是在进行内存分配时,从内存空闲区列表的开始位置遍历,找到第一个能够满足请求大小的空闲分区,并将其分配给请求者。这样做的...
内存分配与回收算法实现 1、实验目的 掌握为实现多道程序并发执行,操作系统是如何通过作业调度选择作业进入内存 系统如何为进入内存的作业分配内存空间,实现多道作业同时驻留内存,就绪进程队列中的多个进程是如何...
本人以前的操作系统实验,当时是用eclipse写的,生成的.class文件在dos下可能无法直接运行。读者可以在src目录下面找到源代码,打开所有.java文件,把第一句package CPUScheduling去掉,然后保存自己重新编译,然后...
本实验报告主要探讨了动态分区存储管理的实现,涉及了动态内存分配与回收的算法,以及如何通过数据结构记录和管理内存状态。 首先,动态分区存储管理方式的核心思想是在进程请求内存时,不预先划分固定大小的分区,...
AIX内存分配回收策略 ##### 1.1 内存分配观察示例—递增分配 在AIX系统中,进程的内存分配可以通过`svmon`命令来进行观察。这种命令能够提供关于进程内存分配的具体细节,包括地址范围、已使用的内存页面数等信息...
根据给定的文件信息,我们可以深入探讨操作系统中的内存分配与回收机制,特别是连续分配与分页式分配这两种常见的内存管理方式。以下是对标题、描述、标签以及部分内容中提及的知识点的详细阐述: ### 操作系统内存...
在本实验中,我们将关注以页面为单位的虚拟内存分配方法,这通常用于现代操作系统,如Linux和Windows。虚拟内存允许程序使用比实际物理内存更大的地址空间,通过将不常用的数据交换到磁盘上,从而实现内存的高效利用...
### 可变分区存储管理方式的内存分配与回收 #### 概述 可变分区存储管理方式是一种在早期操作系统中广泛采用的内存管理技术。它通过动态地将内存划分为不同大小的分区来满足不同程序的内存需求。这种方式能够有效地...
在“neicun.rar”这个压缩包中,我们可以找到关于内存分配与回收的课程设计,这将涵盖一些关键概念和技术。以下是对这些主题的详细解释: 1. **内存分配**: - **连续分配**:早期的操作系统采用这种方式,将内存...
### 可变分区存储管理方式的内存分配与回收(C++) #### 一、概述 在计算机科学领域,尤其是操作系统的设计与实现中,内存管理是一项核心功能。合理的内存管理策略不仅能够提升系统的整体性能,还能有效地避免内存...
Android模拟内存分配与回收涉及了操作系统层面的内存管理和Java层的垃圾回收机制。本教程将深入探讨这两种算法——循环首次适应算法(First Fit)和最佳适应算法(Best Fit),以及它们在Android内存管理中的应用。 ...
本文将详细探讨可变分区存的内存分配与回收过程,以及紧凑算法的实现,同时结合C/C++语言编译器的相关知识进行讲解。 可变分区存储管理是一种动态内存分配策略,它允许根据程序的需求分配不同大小的内存区域。这种...