WO/2005/003971 | QUEUED LOCKS USING MONITOR-MEMORY WAIT |
JP2008129981 | CONNECTION DESTINATION DETERMINIATION SERVER AND LOAD DISTRIBUTION METHOD |
WO/2022/230644 | MANAGEMENT SYSTEM AND MANAGEMENT METHOD |
ZHOU XINGJUN (CN)
LU GANG (CN)
WANG WENJIE (CN)
ZHOU XINGJUN (CN)
LU GANG (CN)
CN101894049A | 2010-11-24 | |||
CN101493767A | 2009-07-29 | |||
US20090070776A1 | 2009-03-12 | |||
CN1829977A | 2006-09-06 |
北京安信方达知识产权代理有限公司 (CN)
权 利 要 求 书 1、 一种自适应回收垃圾对象的方法, 包括: 当系统运行期间, 释放垃圾对象时, 同时释放所述垃圾对象的堆内空间 及堆外空间。 2、 如权利要求 1所述的方法, 其中, 所述垃圾对象为 JAVA垃圾对象。 3、 如权利要求 2所述的方法, 所述方法还包括: 选择要释放的垃圾对象, 选择时, 先选择占用空间最大的垃圾对象进行 释放, 若释放后内存空间仍不能满足当前系统运行需要, 则进一步选择剩余 垃圾对象中占用空间最大的垃圾对象进行释放, 直到释放的空间满足当前系 统运行需要。 4、 如权利要求 3所述的方法, 所述方法还包括: 选择要释放的垃圾对象后,根据当前系统运行 CPU资源使用状况和回收 该垃圾的算法复杂度判断是否回收该垃圾对象,若当前 CPU的资源足够释放 该垃圾对象时判定回收该垃圾对象, 否则不回收该垃圾对象, 选择其余垃圾 对象中占用空间最大垃圾对象的进行释放。 5、 如权利要求 3或 4所述的方法, 其中: 选择占用空间最大的垃圾对象 的步骤包括: ( 1 )当虚拟机之外的进程触发垃圾对象回收时, 选择占用堆外空间最大 的垃圾对象; ( 2 )当检测到内存占用量超过系统稳定阀值时释放垃圾对象时, 选择占 用的堆内及堆外空间之和最大的垃圾对象; ( 3 )当创建新的 JAVA对象且因内存不够需要释放垃圾对象时, 选择占 用堆内空间最大的垃圾对象。 6、 如权利要求 2所述的方法, 所述方法还包括: 系统运行期间, JAVA虚拟机遍历堆空间中的所有对象, 将引用数为 0 的对象设为垃圾对象, 并计算回收所述垃圾对象的复杂粒度; 所述遍历对象是定时遍历, 或是需要进行垃圾对象回收时进行遍历。 7、 一种自适应回收垃圾对象的系统, 包括释放模块; 其中: 所述释放模块设置成: 释放垃圾对象时, 同时释放所述垃圾对象的堆内 空间及堆外空间。 8、 如权利要求 7所述的系统, 其中, 所述垃圾对象为 JAVA垃圾对象。 9、 如权利要求 8所述的系统, 所述系统还包括选择模块, 所述选择模块设置成: 选择释放的垃圾对象, 在选择释放的垃圾对象时, 先选择占用空间最大的垃圾对象进行释放, 若释放后内存空间仍不能满足当 前系统运行需要, 则进一步选择剩余垃圾对象中占用空间最大的垃圾对象进 行释放, 直到释放的空间满足当前系统运行需要。 10、 如权利要求 9所述的系统, 所述系统还包括判断模块, 其中: 所述选择模块还设置成: 将选择的垃圾对象发送至所述判断模块, 以及 当所述判断模块判定选择的垃圾对象不回收时从剩余垃圾对象中选择占用空 间最大的垃圾对象; 所述判断模块设置成:根据当前系统运行 CPU资源使用状况和回收该垃 圾的算法复杂度判断是否回收所选择的垃圾对象,若当前 CPU的资源足够释 放所选择的垃圾对象时判定回收该垃圾对象, 否则不回收该垃圾对象; 当判 定不回收该垃圾对象时通知所述选择模块重新选择垃圾对象进行回收。 11、 如权利要求 9或 10所述的系统, 其中, 所述选择模块设置成按照以 下方式选择占用空间最大的垃圾对象: ( 1 )当虚拟机之外的进程触发垃圾对象回收时, 选择占用堆外空间最大 的垃圾对象; ( 2 )当检测到内存占用量超过系统稳定阀值时释放垃圾对象时, 选择占 用的堆内及堆外空间之和最大的垃圾对象; ( 3 )当创建新的 JAVA对象且因内存不够需要释放垃圾对象时, 选择占 用堆内空间最大的垃圾对象。 12、 如权利要求 7所述的系统, 所述系统还包括设置模块; 所述设置模块设置成: 在系统运行期间, 遍历堆空间中的所有对象, 将 引用数为 0的对象设为垃圾对象, 以及计算回收所述垃圾对象的复杂粒度; 其中, 所述设置模块遍历对象是定时遍历, 或是需要进行垃圾对象回收时进 行遍历。 |
技术领域
本发明涉及 JAVA虚拟机领域, 尤其涉及一种自适应回收垃圾对象的系 统及方法。
背景技术
JAVA是目前使用最广泛的程序设计语言, JAVA由于其跨平台性,有很 强的可移植性, 得到广大程序员的青睐, JAVA程序广泛应用于服务器、 PC、 移动终端、 嵌入式消费电子产品、 智能卡等领域, 并正在向更广泛的领域扩 展。
JAVA是由传统的面向对象语言 C++演进过来, 运行于 JAVA虚拟机之 上, 由 JAVA虚拟机管理资源和屏蔽平台相关性。 对内存的控制和及时释放 是一项很复杂的工作, 为了将程序员从这项工作中解放出来, JAVA虚拟机 建立了垃圾回收机制。
现用的垃圾回收调度算法有:
1 系统定时遍历堆中所有对象, 判断对象为垃圾就进行回收。 这种垃圾 回收调度方法不及时, 可能在实例化一个对象时, 堆空间不够导致为对象分 配空间失败, 还可能会在 CPU繁忙时, 到达定时回收时间, 还要回收所有垃 圾。 导致系统更繁忙, 程序运行不畅。
2 在新创建一个对象时, 判断堆空间是否足够, 如果不够, 马上调度垃 圾回收算法, 回收所有垃圾。 这种调度方式只对 JAVA虚拟机堆空间的内存 进行管理, 不能限制分配在堆外空间的内存。 釆用这种调度方法会出现堆空 间足够, 垃圾对象占用较大堆外空间, 造成内存资源的浪费。 甚至因为内存 不够而出现导致系统运行不畅。
3 JAVA程序开发人员主动调用 JAVA虚拟机提供的垃圾回收接口函数 调度垃圾回收。 这种办法又恢复到传统编程方式的内存管理方 法。 其缺点是 要预先确定占用的内存空间是否应该被回收, 程序员不仅要考虑如何实现算 法满足应用, 还要花费很多精力考虑合理利用内存, 避免内存泄露。
另外, 现有的垃圾回收算法均釆用一次调度全部回收 的方式进行垃圾回 收。垃圾回收算法, 涉及到内存碎片整理等,是一项很浪费 CPU资源的工作。 为了消除传统垃圾回收算法的以上缺点, 提高 JAVA虚拟机性能。
发明内容
本发明提供一种自适应回收垃圾对象的系统及 方法, 释放垃圾对象时, 释放垃圾对象占用的所有空间, 避免了内存空间的浪费。 本发明提供了一种自适应回收垃圾对象的方法 , 包括:
当系统运行期间, 释放垃圾对象时, 同时释放所述垃圾对象的堆内空间 及堆外空间。 其中, 所述垃圾对象为 JAVA垃圾对象。
所述方法还包括: 选择要释放的垃圾对象, 选择时, 先选择占用空间最 大的垃圾对象进行释放, 若释放后内存空间仍不能满足当前系统运行需 要, 则进一步选择剩余垃圾对象中占用空间最大的 垃圾对象进行释放, 直到释放 的空间满足当前系统运行需要。
所述方法还包括: 选择要释放的垃圾对象后, 根据当前系统运行 CPU资 源使用状况和回收该垃圾的算法复杂度判断是 否回收该垃圾对象, 若当前 CPU的资源足够释放该垃圾对象时判定回收该垃 圾对象, 否则不回收该垃圾 对象, 选择其余垃圾对象中占用空间最大垃圾对象的 进行释放。
其中: 选择占用空间最大的垃圾对象的步骤包括:
( 1 )当虚拟机之外的进程触发垃圾对象回收时, 选择占用堆外空间最大 的垃圾对象;
( 2 )当检测到内存占用量超过系统稳定阀值时释 垃圾对象时, 选择占 用的堆内及堆外空间之和最大的垃圾对象;
( 3 )当创建新的 JAVA对象且因内存不够需要释放垃圾对象时, 选择占 用堆内空间最大的垃圾对象。 所述方法还包括: 系统运行期间, JAVA虚拟机遍历堆空间中的所有对 象, 将引用数为 0的对象设为垃圾对象, 并计算回收所述垃圾对象的复杂粒 度; 所述遍历对象是定时遍历, 或是需要进行垃圾对象回收时进行遍历。
本发明还提供了一种自适应回收垃圾对象的系 统, 包括释放模块; 其中: 所述释放模块设置成: 释放垃圾对象时, 同时释放所述垃圾对象的堆内 空间及堆外空间。
其中, 所述垃圾对象为 JAVA垃圾对象。
所述系统还包括选择模块,
所述选择模块设置成: 选择释放的垃圾对象, 在选择释放的垃圾对象时, 先选择占用空间最大的垃圾对象进行释放, 若释放后内存空间仍不能满足当 前系统运行需要, 则进一步选择剩余垃圾对象中占用空间最大的 垃圾对象进 行释放, 直到释放的空间满足当前系统运行需要。
所述系统还包括判断模块, 其中:
所述选择模块还设置成: 将选择的垃圾对象发送至所述判断模块, 以及 当所述判断模块判定选择的垃圾对象不回收时 从剩余垃圾对象中选择占用空 间最大的垃圾对象;
所述判断模块设置成:根据当前系统运行 CPU资源使用状况和回收该垃 圾的算法复杂度判断是否回收所选择的垃圾对 象,若当前 CPU的资源足够释 放所选择的垃圾对象时判定回收该垃圾对象, 否则不回收该垃圾对象; 当判 定不回收该垃圾对象时通知所述选择模块重新 选择垃圾对象进行回收。
其中,所述选择模块设置成按照以下方式选择 占用空间最大的垃圾对象:
( 1 )当虚拟机之外的进程触发垃圾对象回收时, 选择占用堆外空间最大 的垃圾对象;
( 2 )当检测到内存占用量超过系统稳定阀值时释 垃圾对象时, 选择占 用的堆内及堆外空间之和最大的垃圾对象;
( 3 )当创建新的 JAVA对象且因内存不够需要释放垃圾对象时, 选择占 用堆内空间最大的垃圾对象。 所述系统还包括设置模块;
所述设置模块设置成: 在系统运行期间, 遍历堆空间中的所有对象, 将 引用数为 0的对象设为垃圾对象, 以及计算回收所述垃圾对象的复杂粒度; 其中, 所述设置模块遍历对象是定时遍历, 或是需要进行垃圾对象回收 时进行遍历。
综上所述, 本发明提供一种自适应回收垃圾对象的系统及 方法, 通过释 放垃圾对象占用的所有空间, 避免了内存空间的浪费; 再者, 可根据当前系 统运行需要进行释放, 而不是一次释放所有垃圾对象, 提高了 CPU资源的利 用率以及 JAVA虚拟机的性能。
本发明尤其适用于 CPU性能低、 内存容量较小的嵌入式系统上的 JAVA 虚拟机。 附图概述
图 1是本发明系统结构示意图;
图 2是本发明方法流程图。
本发明的较佳实施方式
本发明提供一种自适应回收垃圾对象的系统及 方法, 当系统运行期间, 释放 JAVA垃圾对象时, 同时释放该对象的堆内空间及堆外空间。
本实施例提供一种自适应回收垃圾对象的系统 , 如图 1所示, 包括释放 模块、 判断模块、 选择模块及设置模块;
选择模块设置成: 选择释放的垃圾对象;
选择模块选择释放的垃圾对象时, 先选择占用空间最大的垃圾对象进行 释放, 若释放后内存空间仍不能满足当前系统运行需 要, 则进一步选择剩余 垃圾对象中占用空间最大垃圾对象的进行释放 , 直到释放的空间满足当前系 统运行需要。
选择模块还设置成: 将选择的垃圾对象发送至判断模块, 以及当判断模 块判定选择的垃圾对象不可以回收时从剩余垃 圾对象中选择占用空间最大的 垃圾对象;
判断模块设置成:根据当前系统运行 CPU资源使用状况和回收该垃圾的 算法复杂度判断是否回收选择的垃圾对象,若 当前 CPU的资源足够释放该垃 圾对象时判定可以回收该垃圾对象, 否则不可以回收该垃圾对象; 当判定不 可以回收该垃圾对象时通知选择模块重新选择 垃圾对象进行回收。
释放模块设置成: 释放 JAVA垃圾对象时, 同时释放该垃圾对象的堆内 空间及堆外空间。 选择模块选择占用空间最大的垃圾对象是指:
( 1 )当虚拟机之外的进程触发垃圾对象回收时, 选择占用堆外空间最大 的垃圾对象;
( 2 )当检测到内存占用量超过系统稳定阀值时释 垃圾对象时, 选择占 用的堆内及堆外空间之和最大的垃圾对象;
( 3 )当创建新的 JAVA对象且因内存不够需要释放垃圾对象时, 选择占 用堆内空间最大的垃圾对象。
设置模块设置成: 系统运行期间, 遍历堆空间中的所有对象, 将引用数 为 0的对象设为垃圾对象, 以及计算回收该垃圾对象的复杂粒度;
设置模块遍历对象可以是定时遍历, 也可以是需要进行垃圾对象回收时 进行遍历。
本实施例提供一种自适应回收垃圾对象的方 法, JAVA虚拟机创建一个 对象信息列表, 记录 JAVA程序运行期间所有对象大小的大小、 创建该对象 申请的堆内及堆外空间, 以及标记对象是否为垃圾, 队列按照可释放空间大 小排序。
当系统运行期间, 释放 JAVA垃圾对象时, 同时释放该对象的堆内空间 及堆外空间。 如图 2所示, 包括以下步骤: 步骤 SI : 当需要释放 JAVA程序的对象占用的空间时, JAVA虚拟机按 照预设的回收对象方式选择回收对象;
预设的回收对象方式可以但不限于以下方式:
( 1 )虚拟机之外的进程触发垃圾对象回收。
和虚拟机相关的进程(如图形引擎、 媒体播放模块等), 在申请内存时, 探测到内存不足时, 通知 JAVA虚拟机进行垃圾回收, JAVA虚拟机接收到 回收通知, 釆用占用堆外空间大优先回收的方式来回收垃 圾对象, 即选择占 用堆外空间最大的垃圾对象作为回收对象。
( 2 )定时检测系统, 回收垃圾对象。
定期查询当前内存使用状态, 如果内存占用量超过系统稳定阀值, 则查 找当前可供回收的垃圾对象。 釆用消耗内存资源多优先回收的方式来回收垃 圾, 即选择占用内存最大的垃圾对象作为回收对象 。
此处消耗内存指占用的堆内及堆外空间之和。
( 3 )堆空间不够时触发垃圾对象回收。
JAVA程序创建新的对象时, 检查是否有足够的内存供分配, 如果不足, 釆用占据堆内空间多优先回收的方式来回收垃 圾, 即选择占用堆内空间最大 的垃圾对象作为回收对象。
步骤 S2: JAVA虚拟机根据当前系统运行 CPU资源使用状况和回收该垃 圾的算法复杂度判断是否回收该垃圾对象, 是则执行步骤 S3 , 否则执行步骤 S6;
复杂粒度的计算方法可参照现有技术。
判断是否回收该垃圾对象是指,若当前 CPU的资源足够释放该垃圾对象 时判定可以回收该垃圾对象, 否则不可以回收该垃圾对象。
JAVA程序运行期间, JAVA虚拟机遍历堆空间中的所有对象, 查询对象 的引用计数, 当某对象的引用数为 0时, 便认为该对象是垃圾对象, 将对象 队列中标记为垃圾对象, 并计算回收该垃圾对象的复杂粒度(即回收该 垃圾 对象需要消耗的 CPU资源) 。 遍历对象可以是定时遍历, 也可以是需要回收垃圾对象时进行遍历。 步骤 S3: 回收该垃圾对象, 即释放其占用的堆内及堆外空间;
步骤 S4: 判断释放的空间是否已满足当前运行需要, 是则执行步骤 S5, 否则返回步骤 Sl。
步骤 S5: 整理内存碎片。
步骤 S6: 选择下一个垃圾对象, 然后返回步骤 S2。
本领域普通技术人员可以理解上述方法中的 全部或部分步骤可通过程序 来指令相关硬件完成, 所述程序可以存储于计算机可读存储介质中, 如只读 存储器、 磁盘或光盘等。 可选地, 上述实施例的全部或部分步骤也可以使用 一个或多个集成电路来实现。 相应地, 上述实施例中的各模块 /单元可以釆用 硬件的形式实现, 也可以釆用软件功能模块的形式实现。 本发明不限制于任 何特定形式的硬件和软件的结合。
以上所述仅为本发明的优选实施例而已, 并不用于限制本发明, 对于本 领域的技术人员来说, 本发明可以有各种更改和变化。 凡在本发明的精神和 原则之内, 所作的任何修改、 等同替换、 改进等, 均应包含在本发明的保护 范围之内。
工业实用性
综上所述, 本发明提供一种自适应回收垃圾对象的系统及 方法, 通过释 放垃圾对象占用的所有空间, 避免了内存空间的浪费; 再者, 可根据当前系 统运行需要进行释放, 而不是一次释放所有垃圾对象, 提高了 CPU资源的利 用率以及 JAVA虚拟机的性能, 因此具有极强的工业实用性。