CN110457152A - 一种用代理模式解决内存泄露的系统和方法 - Google Patents
一种用代理模式解决内存泄露的系统和方法 Download PDFInfo
- Publication number
- CN110457152A CN110457152A CN201910623134.1A CN201910623134A CN110457152A CN 110457152 A CN110457152 A CN 110457152A CN 201910623134 A CN201910623134 A CN 201910623134A CN 110457152 A CN110457152 A CN 110457152A
- Authority
- CN
- China
- Prior art keywords
- inner classes
- static inner
- static
- life cycle
- classes
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
- G06F11/0703—Error 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/0706—Error 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/073—Error 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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
- G06F11/0703—Error 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/0793—Remedial 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.根据权利要求1所述的用代理模式解决内存泄露的系统,其特征在于,所述长生命周期的非静态内部类其生命周期比所述外部类的生命周期长。
4.一种用代理模式解决内存泄露的方法,其特征在于,在存在强引用关系的两个非静态内部类之间设置一代理非静态内部类,其中至少有一个非静态内部类为长生命周期的非静态内部类,代理非静态内部类和长生命周期的非静态内部类为强引用关系,代理非静态内部类和另一个非静态内部类为弱引用关系,该另一个非静态内部类与一个外部类之间为强引用关系。
5.根据权利要求4所述的用代理模式解决内存泄露的方法,其特征在于,其包括以下步骤:
A1:判断存在强引用关系的两个非静态内部类,其中至少有一个非静态内部类为长生命周期的非静态内部类;
A2:在上述两个非静态内部类之间插入代理非静态内部类;
A3:设置长生命周期的非静态内部类和代理非静态内部类之间为强引用关系;
A4:设置代理非静态内部类和上述除长生命周期的非静态内部类之外的另一个非静态内部类之间为弱引用关系。
6.根据权利要求4所述的用代理模式解决内存泄露的方法,其特征在于,所述长生命周期的非静态内部类之外的另一个非静态内部类和一个外部类之间也存在强引用关系。
7.根据权利要求4所述的用代理模式解决内存泄露的方法,其特征在于,所述长生命周期的非静态内部类其生命周期比所述外部类的生命周期长。
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 true CN110457152A (zh) | 2019-11-15 |
CN110457152B 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) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112015395A (zh) * | 2020-08-28 | 2020-12-01 | 中移(杭州)信息技术有限公司 | 防止内存泄漏方法、装置及计算机可读存储介质 |
Citations (9)
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进行消息处理的方法和装置 |
CN107678966A (zh) * | 2017-10-09 | 2018-02-09 | 武汉斗鱼网络科技有限公司 | 批量单元测试方法、装置、可读存储介质及设备 |
CN108021445A (zh) * | 2017-11-22 | 2018-05-11 | 广州品唯软件有限公司 | 内存优化方法、装置、系统及计算机可读存储介质 |
CN109299132A (zh) * | 2018-11-29 | 2019-02-01 | 中国人民财产保险股份有限公司 | Sql数据处理方法、系统以及电子设备 |
CN109558308A (zh) * | 2018-09-29 | 2019-04-02 | 中国平安人寿保险股份有限公司 | 应用程序内存泄露检测方法、装置、电子设备及存储介质 |
-
2019
- 2019-07-11 CN CN201910623134.1A patent/CN110457152B/zh active Active
Patent Citations (9)
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进行消息处理的方法和装置 |
CN107678966A (zh) * | 2017-10-09 | 2018-02-09 | 武汉斗鱼网络科技有限公司 | 批量单元测试方法、装置、可读存储介质及设备 |
CN108021445A (zh) * | 2017-11-22 | 2018-05-11 | 广州品唯软件有限公司 | 内存优化方法、装置、系统及计算机可读存储介质 |
CN109558308A (zh) * | 2018-09-29 | 2019-04-02 | 中国平安人寿保险股份有限公司 | 应用程序内存泄露检测方法、装置、电子设备及存储介质 |
CN109299132A (zh) * | 2018-11-29 | 2019-02-01 | 中国人民财产保险股份有限公司 | Sql数据处理方法、系统以及电子设备 |
Non-Patent Citations (1)
Title |
---|
杨舜尧: "swift内存管理机制深度解析", 《信息技术与信息化》 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112015395A (zh) * | 2020-08-28 | 2020-12-01 | 中移(杭州)信息技术有限公司 | 防止内存泄漏方法、装置及计算机可读存储介质 |
CN112015395B (zh) * | 2020-08-28 | 2023-04-07 | 中移(杭州)信息技术有限公司 | 防止内存泄漏方法、装置及计算机可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN110457152B (zh) | 2022-12-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107092488B (zh) | 一种对应用进行无侵入化埋点的实现方法及系统 | |
CN103218552B (zh) | 基于用户行为的安全管理方法及装置 | |
CN105550584A (zh) | 一种Android平台下基于RBAC的恶意程序拦截及处置方法 | |
CN109933328B (zh) | 智能合约的扩展编译方法,区块链节点及系统,存储介质 | |
US9245112B2 (en) | Apparatus and method for managing entitlements to program code | |
CN103595867B (zh) | 基于多卡识别的应用程序实现方法及装置 | |
US20100192159A1 (en) | Separation kernel with memory allocation, remote procedure call and exception handling mechanisms | |
CN102955915B (zh) | 一种Java应用安全访问控制方法及其装置 | |
CN105005740B (zh) | 终端应用的控制方法和系统 | |
US8469267B2 (en) | Method for implementing a wireless personal communication protocol for an IC card | |
CN110457152A (zh) | 一种用代理模式解决内存泄露的系统和方法 | |
CN106066803A (zh) | 应用程序运行控制的方法及装置 | |
CN110427271A (zh) | 建立连接的方法、装置、存储介质和计算机设备 | |
US20180300120A1 (en) | Method for updating a package | |
CN106293313A (zh) | 多界面生成系统及方法 | |
CN104992116B (zh) | 基于intent sniffer的监测方法及系统 | |
CN112698912B (zh) | 一种Java Card虚拟机运行环境及内存管理方法 | |
CN111628997B (zh) | 一种防止攻击方法及装置 | |
CN103679017A (zh) | 防止用户界面被劫持的装置及方法 | |
CN105100901A (zh) | 一种虚拟存储卡配置方法及系统 | |
CN105451233A (zh) | 一种反监听的方法、系统及移动终端 | |
CN107241425B (zh) | 一种基于Web服务的非阻塞端信息跳变方法 | |
WO2023168913A1 (zh) | Sdk与接入应用的兼容方法、装置、设备及介质 | |
US7093065B2 (en) | Random access memory initialization | |
CN107741887A (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 |