Java虚拟机的垃圾回收移动通信终端及回收方法

文档序号:6460210阅读:183来源:国知局
专利名称:Java虚拟机的垃圾回收移动通信终端及回收方法
技术领域
本发明涉及虚拟机环境中的内存管理领域,尤其是涉及移动通信终端上运 行的Java虚拟机的垃圾回收方法及垃圾回收移动通信终端。
背景技术
Java程序设计语言是由Sim公司推出的跨平台面向对象高级程序设计语 言,它的可执行代码是编译以后统一标准的Java字节码(Byte code) 。 Java 语言依赖于称为Java虚拟机(Java virtual machine, JVM)的模拟机。JVM 使得程序员不是和系统打交道,而是和虚拟机打交道。因此程序员使用的函数 是JVM内嵌的函数,而不是操作系统的函数。这非常先进,因为它提供了可移 植性。同时,JVM也非常小,不占用大量的内存。这意味着JVM可以被应用于 许多不同的机器。例如,电视机,蜂窝移动电话以及计算机。目前在移动通信 终端领域,A固公司表示,目前它已经供应了 2. 6亿份用于移动通信终端的ARM Java软件。索爱和诺基亚等手机制造商都已经开发了自己的多任务Jave虚拟 机用于手机等移动通信终端领域。JVM是用来同步处理VoIP、 3D游戏、音乐 下载和播放、电子邮件和即时信息等任务的。在Java虚拟机中,垃圾回收就是自动释放不再被程序所使用的对象的过 程。垃圾回收方法必须能断定哪些对象是不再被引用的,哪些对象是活动的, 并且能够把不再被引用的对象所占据的空间释放出来,而不影响活动对象。这 些对象中不再被引用的对象称为不可达对象。活动的,被引用的对象称为可达 对象。而可达对象和不可达对象又根据其存储内容分为值类型对象和引用类型 对象。值类型对象指其存储的是某种类型的值,引用类型对象是指对其它对象 的引用(类似C语言中的指针)。同时,传统的垃圾回收方法都是不可调度的, 它们并不适合移动通信终端系统。且由于空间的不断分配和回收,必然会形成 大量的内存碎片。这些碎片占用了空间且不能够参与分配和回收,这会造成空 间浪费现象。虽然碎片的总空间可能足够大,但由于不能参与分配,特别是像在移动通信终端这样内存较小的系统中,碎片会导致虚拟机产生不必要的"内 存不足"错误。JVM的垃圾回收把用户从释放占用内存的重担中解救出来。使用户可以在 应用程序开发时不必关心内存回收的各种烦恼问题,从而可以提高开发效率。 同时能够帮助程序保持完整性,避免因失误(或故意)错误地释放内存而导致Java虚拟机的崩溃。现有的专利文献包括专利申请号为200510061994.9的中国专利申请"支 持多进程的Java虚拟机实现方法"和专利号为6070173的美国专利"Method and Apparatus for Assisting Garbage Collection Process within a Java Virtual Machine"(—种用于辅助Java虚拟机垃圾回收过程的方法和装置)。第200510061994. 9号中国专利特征如下 一、引入一种支持多进程的Java 虚拟机的进程切换方法。二、引入一种支持多进程的Java虚拟机的进程通讯 方法。三、引入一种支持多进程的Java虚拟机的内存控制方法。该专利的缺 点是提出的支持多进程的Java虚拟机并不适用于像移动通信终端这样的嵌入 式设备领域。它的内存控制方法没有相应的垃圾回收方法,仅仅指出一些内存 控制结构。第6070173号美国专利特征如下 一、使用虚拟对象堆和物理对象堆辅助 Java虚拟机垃圾回收过程。二、设定虚拟对象堆的阈值, 一旦系统对象超过 该值就进行垃圾回收。该专利的缺点是虚拟对象堆和物理对象堆并不适用在移 动通信终端这类内存较小的设备实现,而且它不能控制垃圾回收时机,只能在 系统到达一定的时间点才进行垃圾回收。发明内容本发明欲解决的问题在于,提供了一种移动通信终端中Java虚拟机的垃 圾回收方法,用于正确区分出系统使用的对象的类型,保证系统运行的准确性。为了实现上述目的,本发明提供了一种移动通信终端中Java虚拟机的垃 圾回收方法,包括保存当前线程的上下文环境;遍历Java虚拟机内存中的所有运行时对象,对可达对象的标志位进行标 记,并对可达对象的类型进行记录;对未标记的对象占用的Java虚拟机内存空间进行合并以及释放;对可达对象的内存空间进行紧縮处理;恢复当前线程的上下文环境。所述对可达对象的类型进行记录的步骤进一步包括 定义一位图,所述位图中的位对应所述Java虚拟机的内存空间; 对引用类型或者值类型的对象所占据的Java虚拟机的内存空间在位图中 的对应位置位。所述对可达对象进行标记的步骤进一步包括对Java虚拟机内存中已标 记的对象的子对象进行递归标记。在执行保存当前线程的上下文环境的步骤之前,将Java虚拟机内存分成 固定大小的块。所述紧縮处理步骤包括当Java虚拟机内存不足时,遍历所述位图,确定引用类型的对象的位置, 回收其空间;和/或遍历所述位图,确定值类型的对象的位置,将所述值类型的对象收集到一 连续的区块中。保存当前线程的上下文环境的步骤之前进一步包括-.Java虚拟机调度模块根据垃圾回收线程的优先级参数,调用该垃圾回收 线程,执行保存当前线程的上下文环境的步骤。本发明还公开了一种对Java虚拟机中的垃圾进行回收的移动通信终端, Java虚拟机中包括一垃圾回收模块,该垃圾回收模块进一步包括上下文环境保存模块,用于保存当前线程的上下文环境;标记模块,用于遍历Java虚拟机内存中的所有运行时对象,对可达对象 的标志位进行标记,并对可达对象的类型进行记录;内存合并模块,用于对未标记的对象占用的Java虚拟机内存空间进行合 并以及释放;紧縮模块,用于对可达对象的内存空间进行紧縮处理; 上下文环境恢复模块,用于恢复当前线程的上下文环境。 所述标记模块进一步包括一位图记录模块,该位图记录模块用于定义一位 图,所述位图中的位对应所述Java虚拟机的内存空间;利用所述位图对所述可达对象的类型进行记录,对引用类型或者值类型的对象所占据的Java虚拟机的内存空间在位图中的对应位置位。所述紧縮模块,用于当Java虚拟机内存不足时,遍历所述位图,确定引用类型的对象的位置,回收其对象空间;禾Q/或遍历所述位图,确定值类型的对象的位置,将所述值类型的对象收集到个连续的区块中。Java虚拟机的调度模块根据所述垃圾回收模块的优先级参数,执行该垃 圾回收模块。本发明可正确区分出系统使用的对象的类型,预知并记录下内存区域中自 由内存的大小。这样保证系统运行的准确性。另外,本发明将系统内存分为固 定大小的内存块,再将可达对象收集到一个连续的区域,实现对已分配内存进 行紧縮的内存碎片管理。


图1所示为本发明的整体结构示意图;图2所示为本发明的垃圾回收模块的具体结构示意图;图3所示为本发明的具体处理步骤流程图;图4所示为本发明步骤304的详细实现流程图。
具体实施方式
以下配合实施例以及附图,详细描述本发明的技术特征。 如图1所示为本发明的整体结构示意图。移动通信终端100中,操作系统130运行于硬件140之上,Java虚拟机 120基于操作系统130执行相关操作,为各应用软件110提供运行平台。移动 通信终端100包括手机、PDA等。Java虚拟机120中包括垃圾回收模块200、 运行时环境201、 Java虚拟机调度模块202等各功能模块。该垃圾回收模块 200将针对运行时环境201进行垃圾回收操作。该运行时环境201即系统运行 时应用到的方法区、堆、线程的执行栈和寄存器等。Java虚拟机调度模块202 用于对Java虚拟机中的各个功能模块进行调度,以使各模块依次获取处理器 的执行时间。其他功能模块均为现有技术中的常用模块。Java虚拟机中的各功能模块,包括该垃圾回收模块200,皆具备优先级参 数,Java虚拟机调度模块202将根据各功能模块的该优先级参数进行调用。 垃圾回收模块200作为一个低优先级的线程运行一段时间后,Java虚拟机将 周期性的动态提升其优先级。从而保证在所有其他线程处于等待状态时,具有 低优先级的垃圾回收线程仍能执行,从而动态的调整系统的可用内存,或者, 在内存不足时主动执行。请参阅图2所示为本发明的垃圾回收模块200的具体结构示意图。垃圾回收模块200包括内存划分模块210、上下文环境保存模块220、标 记模块230、内存合并模块240、紧縮模块250以及上下文环境恢复模块260。内存划分模块210用于在首次运行该垃圾回收模块200时,将系统内存划 分为固定大小的块,以降低移动对象的复杂性以及避免内存碎片。譬如每块可 分为32字节。一Java对象通常在内存空间中占用一个或多个块,该多个块在 物理上可以不连续。上下文环境保存模块220用于保存当前线程的上下文环境。该上下文环境 主要包括当前线程的执行栈指针,当前执行栈中的有关结构以及当前的程序计 数器指针。这些指针用于在垃圾回收处理后恢复系统的上下文。标记模块230用于标记Java虚拟机中的所有的可达对象,可达对象即仍 然被程序所使用的对象。该可达对象包括Java虚拟机中的全局对象和临时对 象,以及Java虚拟机中的全局性变量、符号表以及用以记录当前所有已装载 类的类表。标记模块230中还包括一位图记录模块231,该位图记录模块用于 定义一位图,所述位图中的位对应记录所述Java虚拟机的内存空间;利用所 述位图对所述可达对象的类型进行记录,对引用类型或者值类型的对象所占据 的Java虚拟机的内存空间在位图中的对应位置位。内存合并模块240用于对未标记的对象占用的Java虚拟机内存空间进行 合并以及释放;还可用于计算当前系统中的最大可用内存。紧縮模块250用于在当前内存量不足时,对值类型或者弓I用类型对象进行 内存空间的紧縮,减小内存碎片。上下文环境恢复模块260用于根据保存的当前线程的上下文环境,恢复当 前线程的上下文环境。请参阅图3所示为本发明的具体处理步骤流程图。步骤301, Java虚拟机调度模块202根据优先级参数调用该垃圾回收模块 200,垃圾回收模块200开始运行。步骤302,在首次运行垃圾回收模块200时,利用内存划分模块210将Java 虚拟机内存分为固定大小的块。步骤303,利用上下文环境保存模块220保存当前线程的上下文环境。如果当前线程非空,则将当前线程的上下文环境保存下来,特别是保存当 前线程的执行栈指针,当前执行栈中的有关结构以及当前的程序计数器指针。 这些指针用于在垃圾回收处理后恢复系统的上下文。步骤304,遍历Java虚拟机内存中的所有运行时对象,利用标记模块230 标记Java虚拟机中的所有的可达对象,并对可达对象的类型进行记录。由于JVM中全局性变量以及用以记录当前所有已装载类的类表在整个JVM 运行期间都是可访问的,因而也要进行标记。请参阅图4所示为本发明步骤304的详细实现流程图。步骤401,遍历Java虚拟机内存中的所有运行时对象,对于可达对象, 将该对象前的标志位置位。该标志位为代表每个对象的数据结构中设置的标志位。步骤402,对内存中已标记的可达对象的子对象即间接可达对象进行递归 标记处理。步骤403,定义一位图,用于对应记录移动通信终端100的Java虚拟机 的内存空间。该位图中的一位例如为对应Java虚拟机内存中的一个字节。步骤404,对可达对象中,值类型的对象所占用的空间在该位图中对应标 记为"0",对引用类型的对象所占用的空间在该位图中置位,即对应标记为 "1",包含引用的字对应的位也对应标记为"1"。当然,也可对值类型的对象所占用的空间在该位图中置位,即对应标记为 "1",对引用类型的对象所占用的空间在该位图中对应标记为"0"。该标记方法可快速区分值类型和引用类型对象,且确切了解所有对象的引 用的分布位置。本发明的垃圾回收算法正确区分出系统使用的对象的值和引用 类型,通过该位图即可预知并记录下内存区域中可达对象占用的内存大小,从 而同时得到自由内存的大小。这样保证系统运行的准确性,使内存开销最小。请继续参阅图3。歩骤305,利用内存合并模块240对未标记的对象占用的Java虚拟机内 存空间进行合并以及释放。艮口,对于不可达对象所占用的Java虚拟机内存空间进行了释放,使其成为自由内存,重新得到应用。步骤306,计算系统中当前的最大可用内存,并判断最大可用内存是否大 于系统当前需要的内存量,如果否,执行步骤307,如果是,执行步骤310。步骤307,利用紧縮模块250进行紧縮处理。遍历所述位图,确定引用类型的对象的位置,根据该引用类型的对象的标 志位回收其空间;和/或遍历所述位图,确定值类型的对象的位置,将所述值类型的对象收集到一 连续的区块中,以获得更大的可用内存量,减小内存碎片。步骤308,判断当前可用内存是否大于系统当前需要的内存量,如果否, 执行步骤309,如果是,执行步骤310。步骤309,抛出异常,结束当前线程,恢复上下文环境,执行步骤311。 步骤310,恢复上下文环境,为线程分配适当的内存空间。 步骤311,垃圾回收模块200让出处理器等待下次调度。 与现有技术相比较,本发明引入一种Java虚拟机的垃圾回收移动通信终 端及回收方法。本发明的垃圾回收方法可根据系统赋予的优先级作为系统线程 被动受调度模块调度执行或由于内存不足而主动执行。正是因为其可调度性, 使其可以在系统空闲时运行,而不是等到内存不足时被动执行,从而有效的利 用了系统资源,因此,本发明为一种渐进运行的垃圾回收方法。本发明的垃圾 回收算法还可正确区分出系统使用的对象的类型,预知并记录下内存区域中自 由内存的大小。这样保证系统运行的准确性。另外,本发明的垃圾回收算法将 系统内存分为固定大小的内存块,再将可达对象收集到一个连续的区域,实现 对已分配内存进行紧縮的内存碎片管理。本发明的保护范围不限于上述说明,本领域的一般技术人员按本发明的构 思,可以对其做出修改或变动,它们应属于本发明的构思范围内。
权利要求
1、一种移动通信终端中Java虚拟机的垃圾回收方法,其特征在于,包括如下步骤保存当前线程的上下文环境;遍历Java虚拟机内存中的所有运行时对象,对可达对象的标志位进行标记,并对可达对象的类型进行记录;对未标记的对象占用的Java虚拟机内存空间进行合并以及释放;对可达对象的内存空间进行紧缩处理;恢复当前线程的上下文环境。
2、 如权利要求l所述的方法,其特征在于,所述对可达对象的类型进行 记录的步骤进一步包括定义一位图,所述位图中的位对应记录所述Java虚拟机的内存空间; 对引用类型或者值类型的对象所占据的Java虚拟机的内存空间在位图中 的对应位置位。
3、 如权利要求1或2所述的方法,其特征在于,所述对可达对象进行标 记的步骤进一步包括对Java虚拟机内存中己标记的对象的子对象进行递归 标记。
4、 如权利要求l所述的方法,其特征在于,在执行保存当前线程的上下 文环境的步骤之前,将Java虚拟机内存分成固定大小的块。
5、 如权利要求2所述的方法,其特征在于,所述紧縮处理步骤包括当Java虚拟机内存不足时,遍历所述位图,确定引用类型的对象的位置, 根据该引用类型的对象的标志位回收其空间;禾B/或遍历所述位图,确定值类型的对象的位置,将所述值类型的对象收集到一 连续的区块中。
6、 如权利要求l、 2、 4或5所述的方法,其特征在于,保存当前线程的 上下文环境的步骤之前进一步包括Java虚拟机调度模块根据垃圾回收线程的优先级参数,调用该垃圾回收 线程,执行保存当前线程的上下文环境的步骤。
7、 一种对Java虚拟机中的垃圾进行回收的移动通信终端,所述移动通信终端中设置有Java虚拟机,其特征在于,所述Java虚拟机包括一垃圾回收模块,该垃圾回收模块进一步包括上下文环境保存模块,用于保存当前线程的上下文环境;标记模块,用于遍历Java虚拟机内存中的所有运行时对象,对可达对象的标志位进行标记,并对可达对象的类型进行记录;内存合并模块,用于对未标记的对象占用的Java虚拟机内存空间进行合并以及释放;紧縮模块,用于对可达对象的内存空间进行紧縮处理; 上下文环境恢复模块,用于恢复当前线程的上下文环境。
8、 如权利要求7所述的移动通信终端,其特征在于,所述标记模块进一 步包括一位图记录模块,该位图记录模块用于定义一位图,所述位图中的位对 应记录所述Java虚拟机的内存空间;利用所述位图对所述可达对象的类型进行记录,对引用类型或者值类型的 对象所占据的Java虚拟机的内存空间在位图中的对应位置位。
9、 如权利要求8所述的移动通信终端,其特征在于,所述紧縮模块,用 于当Java虚拟机内存不足时,遍历所述位图,确定引用类型的对象的位置, 根据该引用类型的对象的标志位回收其空间;和/或遍历所述位图,确定值类型的对象的位置,将所述值类型的对象收集到一 个连续的区块中。
10、 如权利要求7、 8或9所述的移动通信终端,其特征在于,Java虚拟 机的调度模块根据所述垃圾回收模块的优先级参数,执行该垃圾回收模块。
全文摘要
本发明公开了一种Java虚拟机的垃圾回收移动通信终端及回收方法,该方法包括保存当前线程的上下文环境;遍历Java虚拟机内存中的所有运行时对象,对可达对象进行标记,并对可达对象的类型进行记录;对未标记的对象占用的Java虚拟机内存空间进行合并以及释放;对可达对象的内存空间进行紧缩处理;恢复当前线程的上下文环境。本发明可正确区分出系统使用的对象的类型,预知并记录下内存区域中自由内存的大小。这样保证系统运行的准确性。另外,本发明将系统内存分为固定大小的内存块,再将可达对象收集到一个连续的区域,实现对已分配内存进行紧缩的内存碎片管理。
文档编号G06F12/02GK101221535SQ200810056889
公开日2008年7月16日 申请日期2008年1月25日 优先权日2008年1月25日
发明者震 方 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1