CN110457152B - 一种用代理模式解决内存泄露的系统和方法 - Google Patents

一种用代理模式解决内存泄露的系统和方法 Download PDF

Info

Publication number
CN110457152B
CN110457152B CN201910623134.1A CN201910623134A CN110457152B CN 110457152 B CN110457152 B CN 110457152B CN 201910623134 A CN201910623134 A CN 201910623134A CN 110457152 B CN110457152 B CN 110457152B
Authority
CN
China
Prior art keywords
class
static
static inner
proxy
inner class
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201910623134.1A
Other languages
English (en)
Other versions
CN110457152A (zh
Inventor
卢林清
唐进
段凌云
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Guiyang Yuwan Technology Co ltd
Original Assignee
Guiyang Yuwan Technology Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Guiyang Yuwan Technology Co ltd filed Critical Guiyang Yuwan Technology Co ltd
Priority to CN201910623134.1A priority Critical patent/CN110457152B/zh
Publication of CN110457152A publication Critical patent/CN110457152A/zh
Application granted granted Critical
Publication of CN110457152B publication Critical patent/CN110457152B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0706Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment
    • G06F11/073Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment in a memory management context, e.g. virtual memory or cache management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0793Remedial or corrective actions

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种用代理模式解决内存泄露的系统和方法,包括:一判断模块:判断存在强引用关系的两个非静态内部类,其中至少有一个非静态内部类为长生命周期的非静态内部类;一代理模块:用于在两个非静态内部类之间插入一个代理非静态内部类;一强引用设定模块:设置长生命周期的非静态内部类和代理非静态内部类之间为强引用关系;一弱引用设定模块:设置代理非静态内部类和上述除长生命周期的非静态内部类之外的另一个非静态内部类之间为弱引用关系。本发明利用代理模式和弱引用对象,解除外部类和内部类的相互强引用,使非静态内部类的编写便利性得以保持。

Description

一种用代理模式解决内存泄露的系统和方法
技术领域
本发明涉及Java技术领域,尤其涉及的是一种用代理模式解决内存泄露的系统和方法。
背景技术
在Java中,非静态内部类会导致内存泄露,通用解决方法是把非静态内部类改为静态内部类。但这个解决方法会降低写代码的便利性,在开发中,常常需要写一个匿名内部类,这是非静态内部类的一种,如果要把匿名内部类改为静态内部类,写起代码来就不方便。
如图1所示,objectA是被泄露的内存对象,其类型是OuterClass,代表外部类,InnnerClass是其非静态内部类;objectB对象被objectA对象强引用,同时又通过隐私持有OuterClass的this引用的方式,强引用objectA对象;仅仅如此还不会导致内存泄露,最关键的是,objectB又被一个生命周期更长的对象objectC强引用,在objectA对象需要被释放的时候,因为objectC对象的生命周期比objectA的强,同时objectC对象间接通过objectC-objectB-objectA的路径强引用了objectA对象,从而导致objectA对象不能及时被释放,从而导致objectA及objectB对象内存发生内存泄露。
如何既保持非静态内部类在编程上的便利性,又有效防止非静态内部类导致的内存泄露问题,就是本发明要实现的目标。
发明内容
本发明所要解决的技术问题是针对现有技术的不足提供一种用代理模式解决内存泄露的系统和方法。
本发明的技术方案如下:
一种用代理模式解决内存泄露的系统,包括:
一判断模块:判断存在强引用关系的两个非静态内部类,其中至少有一个非静态内部类为长生命周期的非静态内部类;
一代理模块:用于在两个非静态内部类之间插入一个代理非静态内部类;
一强引用设定模块:设置长生命周期的非静态内部类和代理非静态内部类之间为强引用关系;
一弱引用设定模块:设置代理非静态内部类和上述除长生命周期的非静态内部类之外的另一个非静态内部类之间为弱引用关系。
所述的用代理模式解决内存泄露的系统,所述长生命周期的非静态内部类之外的另一个非静态内部类和一个外部类之间也存在强引用关系。
所述的用代理模式解决内存泄露的系统,所述长生命周期的非静态内部类其生命周期比所述外部类的生命周期长。
一种用代理模式解决内存泄露的方法,在存在强引用关系的两个非静态内部类之间设置一代理非静态内部类,其中至少有一个非静态内部类为长生命周期的非静态内部类,代理非静态内部类和长生命周期的非静态内部类为强引用关系,代理非静态内部类和另一个非静态内部类为弱引用关系,该另一个非静态内部类与一个外部类之间为强引用关系。
所述的用代理模式解决内存泄露的方法,其包括以下步骤:
A1:判断存在强引用关系的两个非静态内部类,其中至少有一个非静态内部类为长生命周期的非静态内部类;
A2:在上述两个非静态内部类之间插入代理非静态内部类;
A3:设置长生命周期的非静态内部类和代理非静态内部类之间为强引用关系;
A4:设置代理非静态内部类和上述除长生命周期的非静态内部类之外的另一个非静态内部类之间为弱引用关系。
所述的用代理模式解决内存泄露的方法,所述长生命周期的非静态内部类之外的另一个非静态内部类和一个外部类之间也存在强引用关系。
所述的用代理模式解决内存泄露的方法,所述长生命周期的非静态内部类其生命周期比所述外部类的生命周期长。
解决内存泄露问题,传统的方法是将非静态内部类修改为静态内部类,打破objectB-objectA之间的强引用关系;本发明利用代理模式和弱引用对象,解除外部类和内部类的相互强引用,使非静态内部类的编写便利性得以保持。
附图说明
图1:发生内存泄露的场景;
图2:本发明解决内存泄露的方法;
具体实施方式
以下结合具体实施例,对本发明进行详细说明。
本发明首先提供一种用代理模式解决内存泄露的系统,其包括:
一判断模块:判断存在强引用关系的两个非静态内部类(第一非静态内部类、第二非静态内部类),其中至少有一个非静态内部类为长生命周期的非静态内部类,例如第一非静态内部类为长生命周期的非静态内部类;
一代理模块:用于在两个非静态内部类之间插入一个代理非静态内部类;
一强引用设定模块:设置长生命周期的非静态内部类(例如第一非静态内部类)和代理非静态内部类之间为强引用关系;
一弱引用设定模块:设置代理非静态内部类和上述除长生命周期的非静态内部类之外的另一个非静态内部类(例如第二非静态内部类)之间为弱引用关系;
上述除长生命周期的非静态内部类之外的另一个非静态内部类(例如第二非静态内部类)和一个外部类(outerclass)之间也存在强引用关系;
所述长生命周期的非静态内部类其生命周期比所述外部类的生命周期长。
本发明继续提供一种用代理模式解决内存泄露的方法,其方法为:在存在强引用关系的两个非静态内部类之间设置一代理非静态内部类,其中至少有一个非静态内部类为长生命周期的非静态内部类,代理非静态内部类和长生命周期的非静态内部类为强引用关系,代理非静态内部类和另一个非静态内部类为弱引用关系,该另一个非静态内部类与一个外部类之间为强引用关系。
具体的,其包括以下步骤:
A1:判断存在强引用关系的两个非静态内部类(第一非静态内部类、第二非静态内部类),其中至少有一个非静态内部类为长生命周期的非静态内部类,例如第一非静态内部类为长生命周期的非静态内部类;
A2:在上述两个非静态内部类之间插入代理非静态内部类;
A3:设置长生命周期的非静态内部类(例如第一非静态内部类)和代理非静态内部类之间为强引用关系;
A4:设置代理非静态内部类和上述除长生命周期的非静态内部类之外的另一个非静态内部类(例如第二非静态内部类)之间为弱引用关系;
上述除长生命周期的非静态内部类之外的另一个非静态内部类(例如第二非静态内部类)和一个外部类(outerclass)之间也存在强引用关系;
所述长生命周期的非静态内部类其生命周期比所述外部类的生命周期长。
以下结合具体实施例对本发明进行详细说明;如图2所示:objectC对象为长生命周期的非静态内部类(longlife cycle class),objectC对象强引用objectD对象,objectD对象为新设置的代理非静态内部类(innerclass proxy),objectD对象弱引用objectB对象,objectA对象为外部类,其强引用内部类objectB对象;
例如:objectC想要调用objectB对象的methodForB()方法时,objectB对象拥有一个methodForB()方法,objectD对象同样有一个methodForB()方法,objectC对象直接调用的是objectD对象的methodForB()方法,而如前所述,objectD对象的methodForB()方法中仅调用了objectB对象的methodForB()方法,因此,objectC对象间接地调用到了objectB对象的methodForB()方法。
可以看出,objectD对象是objectB对象的一个代理,其通过WeakReference弱引用持有objectB对象;在objectC对象需要调用objectB对象的方法时,objectC对象调用objectD对象中相同的方法,objectD仅仅将调用转发给objectC对象。
在objectA对象被释放的时候,会释放objectB;因为objectB没有被其他对象强引用,objectB对象会正常释放,从而释放objectB对象对objectA对象的强引用;最终objectA对象和objectB对象都被正常释放,内存泄露问题得以解决。
应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,而所有这些改进和变换都应属于本发明所附权利要求的保护范围。

Claims (7)

1.一种用代理模式解决内存泄露的系统,其特征在于,包括:
一判断模块:判断存在强引用关系的两个非静态内部类,其中至少有一个非静态内部类为长生命周期的非静态内部类;
一代理模块:用于在两个非静态内部类之间插入一个代理非静态内部类;
一强引用设定模块:设置长生命周期的非静态内部类和代理非静态内部类之间为强引用关系;
一弱引用设定模块:设置代理非静态内部类和上述除长生命周期的非静态内部类之外的另一个非静态内部类之间为弱引用关系。
2.根据权利要求1所述的用代理模式解决内存泄露的系统,其特征在于,所述长生命周期的非静态内部类之外的另一个非静态内部类和一个外部类之间也存在强引用关系。
3.根据权利要求2所述的用代理模式解决内存泄露的系统,其特征在于,所述长生命周期的非静态内部类其生命周期比所述外部类的生命周期长。
4.一种用代理模式解决内存泄露的方法,其特征在于,在存在强引用关系的两个非静态内部类之间设置一代理非静态内部类,其中至少有一个非静态内部类为长生命周期的非静态内部类,代理非静态内部类和长生命周期的非静态内部类为强引用关系,代理非静态内部类和另一个非静态内部类为弱引用关系,该另一个非静态内部类与一个外部类之间为强引用关系。
5.根据权利要求4所述的用代理模式解决内存泄露的方法,其特征在于,其包括以下步骤:
A1:判断存在强引用关系的两个非静态内部类,其中至少有一个非静态内部类为长生命周期的非静态内部类;
A2:在上述两个非静态内部类之间插入代理非静态内部类;
A3:设置长生命周期的非静态内部类和代理非静态内部类之间为强引用关系;
A4:设置代理非静态内部类和上述除长生命周期的非静态内部类之外的另一个非静态内部类之间为弱引用关系。
6.根据权利要求4所述的用代理模式解决内存泄露的方法,其特征在于,所述长生命周期的非静态内部类之外的另一个非静态内部类和一个外部类之间也存在强引用关系。
7.根据权利要求4所述的用代理模式解决内存泄露的方法,其特征在于,所述长生命周期的非静态内部类其生命周期比所述外部类的生命周期长。
CN201910623134.1A 2019-07-11 2019-07-11 一种用代理模式解决内存泄露的系统和方法 Active CN110457152B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910623134.1A CN110457152B (zh) 2019-07-11 2019-07-11 一种用代理模式解决内存泄露的系统和方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910623134.1A CN110457152B (zh) 2019-07-11 2019-07-11 一种用代理模式解决内存泄露的系统和方法

Publications (2)

Publication Number Publication Date
CN110457152A CN110457152A (zh) 2019-11-15
CN110457152B true CN110457152B (zh) 2022-12-30

Family

ID=68482559

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910623134.1A Active CN110457152B (zh) 2019-07-11 2019-07-11 一种用代理模式解决内存泄露的系统和方法

Country Status (1)

Country Link
CN (1) CN110457152B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112015395B (zh) * 2020-08-28 2023-04-07 中移(杭州)信息技术有限公司 防止内存泄漏方法、装置及计算机可读存储介质

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6421690B1 (en) * 1998-04-30 2002-07-16 Honeywell International Inc. Computer memory management system
CN101542437A (zh) * 2005-12-07 2009-09-23 微软公司 软件事务性存储器操作的优化
CN102622227A (zh) * 2011-09-13 2012-08-01 北京科技大学 一种支持动态配置的构件模型及构件工厂
CN107015866A (zh) * 2017-03-23 2017-08-04 腾讯科技(深圳)有限公司 一种数据处理方法及装置
CN107515792A (zh) * 2017-07-27 2017-12-26 北京五八信息技术有限公司 功能类使用Handler进行消息处理的方法和装置

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107678966B (zh) * 2017-10-09 2020-07-10 武汉斗鱼网络科技有限公司 批量单元测试方法、装置、可读存储介质及设备
CN108021445B (zh) * 2017-11-22 2021-12-28 广州品唯软件有限公司 内存优化方法、装置、系统及计算机可读存储介质
CN109558308A (zh) * 2018-09-29 2019-04-02 中国平安人寿保险股份有限公司 应用程序内存泄露检测方法、装置、电子设备及存储介质
CN109299132B (zh) * 2018-11-29 2021-08-06 中国人民财产保险股份有限公司 Sql数据处理方法、系统以及电子设备

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6421690B1 (en) * 1998-04-30 2002-07-16 Honeywell International Inc. Computer memory management system
CN101542437A (zh) * 2005-12-07 2009-09-23 微软公司 软件事务性存储器操作的优化
CN102622227A (zh) * 2011-09-13 2012-08-01 北京科技大学 一种支持动态配置的构件模型及构件工厂
CN107015866A (zh) * 2017-03-23 2017-08-04 腾讯科技(深圳)有限公司 一种数据处理方法及装置
CN107515792A (zh) * 2017-07-27 2017-12-26 北京五八信息技术有限公司 功能类使用Handler进行消息处理的方法和装置

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
swift内存管理机制深度解析;杨舜尧;《信息技术与信息化》;20171225(第12期);全文 *

Also Published As

Publication number Publication date
CN110457152A (zh) 2019-11-15

Similar Documents

Publication Publication Date Title
US11120130B2 (en) Method and apparatus for protecting kernel control-flow integrity using static binary instrumentation
CN109933328B (zh) 智能合约的扩展编译方法,区块链节点及系统,存储介质
CN103365644B (zh) 一种扩展软件功能的方法及装置
CN104765612A (zh) 一种访问可信执行环境、可信应用的系统及方法
CN102200916B (zh) 电子设备、可配置的部件及该部件的配置信息存储方法
US8683583B2 (en) Using virtual table protections to prevent the exploitation of object corruption vulnerabilities
CN103927180B (zh) 一种基于安卓系统的功能插件的实现方法及其系统
US20150040112A1 (en) Enabling Interoperability Between Software Applications By Utilizing Partial Binaries
CN110046497B (zh) 一种函数挂钩实现方法、装置和存储介质
CN110457152B (zh) 一种用代理模式解决内存泄露的系统和方法
WO2007021320A2 (en) Systems, methods and computer program products for safety checking executable application programs in a module
CN103177210A (zh) 一种在Android中植入动态污点分析模块的方法
CN103631580B (zh) 一种生成主题图标的方法和装置
US7797573B2 (en) Memory management method and portable terminal device
CN105183484A (zh) 一种多版本应用程序编程接口兼容的方法及装置
CN104424030A (zh) 多进程操作共享内存的方法和装置
CN106775781B (zh) 减小应用安装包的方法、装置及电子设备
CN105094878A (zh) 一种集成系统库文件的方法和装置
US20100138844A1 (en) Flexible hierarchical settings registry for operating systems
CN105653351A (zh) java卡虚拟机的优化方法及系统
CN102243587B (zh) 嵌入式系统中对rom程序的升级方法
CN117520181B (zh) 一种业务流程的调试方法、装置、电子设备及存储介质
CN109918059B (zh) 应用的功能扩展方法、装置、终端设备和存储介质
CN114265722A (zh) 一种数据库的修复方法和电子设备
CN105100901A (zh) 一种虚拟存储卡配置方法及系统

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant