CN112015395A - 防止内存泄漏方法、装置及计算机可读存储介质 - Google Patents

防止内存泄漏方法、装置及计算机可读存储介质 Download PDF

Info

Publication number
CN112015395A
CN112015395A CN202010888393.XA CN202010888393A CN112015395A CN 112015395 A CN112015395 A CN 112015395A CN 202010888393 A CN202010888393 A CN 202010888393A CN 112015395 A CN112015395 A CN 112015395A
Authority
CN
China
Prior art keywords
runnable
executed
strong reference
runable
runnable object
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
Application number
CN202010888393.XA
Other languages
English (en)
Other versions
CN112015395B (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.)
China Mobile Communications Group Co Ltd
China Mobile Hangzhou Information Technology Co Ltd
Original Assignee
China Mobile Communications Group Co Ltd
China Mobile Hangzhou Information 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 China Mobile Communications Group Co Ltd, China Mobile Hangzhou Information Technology Co Ltd filed Critical China Mobile Communications Group Co Ltd
Priority to CN202010888393.XA priority Critical patent/CN112015395B/zh
Publication of CN112015395A publication Critical patent/CN112015395A/zh
Application granted granted Critical
Publication of CN112015395B publication Critical patent/CN112015395B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • G06F12/0253Garbage collection, i.e. reclamation of unreferenced memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/4492Inheritance
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5016Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/546Message passing systems or structures, e.g. queues
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/54Indexing scheme relating to G06F9/54
    • G06F2209/548Queue
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Abstract

本发明公开了一种防止内存泄漏方法,包括:自定义静态可执行对象,所述静态可执行对象实现Runnable接口;使用代理模式将至少一个待执行的第一Runnable对象传入到所述静态可执行对象进行弱引用包装,得到包装后的第二Runnable对象;自定义强引用队列,当所述第一Runnable对象包装完成后,将所述第一Runnable对象插入到所述强引用队列;将所述包装后的第二Runnable对象提交到线程池中等待执行;当所述线程池中目标线程开始执行时,删除所述目标线程执行的第二Runnable对象在所述强引用队列中对应的第一Runnable对象。本发明还提供一种防止内存泄漏装置及计算机可读存储介质。本发明提供的防止内存泄漏方法,能够解耦Runnable对象对外部类的引用,避免外部类的内存泄漏。

Description

防止内存泄漏方法、装置及计算机可读存储介质
技术领域
本发明实施例涉及内存性能优化技术领域,特别涉及一种防止内存泄漏方法、装置及计算机可读存储介质。
背景技术
现有技术中,Java的应用都是基于多线程的,使用多线程就必须定义线程的主体Runnable类,当使用的主体Runnable类以内部类定义的时候,Runnable对象就会持有外部类的引用。当线程提交到线程池中使用的时候,并不能确保线程会立即执行,即使线程被立即执行,也可能因为线程涉及到耗时的输入/输出(I/O)操作,导致线程执行完的时间没法确定,这样,Runnable对象持有的外部类就没法释放,导致外部类的内存泄漏。
发明内容
本发明实施方式的目的在于提供一种防止内存泄漏方法,能够解耦Runnable对象对外部类的引用,避免外部类的内存泄漏。
为解决上述技术问题,本发明的实施方式提供了一种防止内存泄漏方法,所述方法包括:自定义静态可执行对象,所述静态可执行对象实现Runnable接口;使用代理模式将至少一个待执行的第一Runnable对象传入到所述静态可执行对象进行弱引用包装,得到包装后的第二Runnable对象;自定义强引用队列,当所述第一Runnable对象包装完成后,将所述第一Runnable对象插入到所述强引用队列;将所述包装后的第二Runnable对象提交到线程池中等待执行;当所述线程池中目标线程开始执行时,删除所述目标线程执行的第二Runnable对象在所述强引用队列中对应的第一Runnable对象。
本发明的实施方式还提供了一种防止内存泄漏装置,包括:至少一个处理器;以及,与至少一个处理器通信连接的存储器;其中,存储器存储有可被至少一个处理器执行的指令,指令被至少一个处理器执行,以使至少一个处理器能够执行上述的防止内存泄漏方法的步骤。
本发明的实施方式还提供了一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时实现上述防止内存泄漏方法的步骤。
本发明实施方式相对于现有技术而言,对外部类中的待执行的Runnable对象先进行弱引用包装,加入到线程池中待执行,从而解耦待执行的Runnable对象对外部类的引用,避免外部类的内存泄漏。同时,建立强引用队列,用来保存待执行的Runnable对象,避免虚拟机垃圾回收导致目标线程中Runnable对象还没有执行就被销毁的问题。
优选地,所述方法还包括:当目标线程执行完成后,判断是否还存在目标线程对应的第一Runnable对象对外部类的强引用;当还存在目标线程对应的第一Runnable对象对外部类的强引用时,启动报警程序进行报警。这样,在目标线程的执行结束后,通过判断是否还存在对外部类的强引用,当还存在对外部类的强引用时,及时启动报警程序,从而避免系统crash问题。
优选地,所述使用代理模式将至少一个待执行的第一Runnable对象传入到所述静态可执行对象进行弱引用包装,包括:包装所述待执行的第一Runnable对象成弱引用;并将所述弱引用传给mDelegate属性。
优选地,所述将所述第一Runnable对象插入到所述强引用队列,包括:判断所述强引用队列中是否存在所述第一Runnable对象;当所述强引用队列中不存在所述第一Runnable对象时,将所述第一Runnable对象插入到所述强引用队列。
优选地,所述删除所述目标线程的第二Runnable对象在所述强引用队列中对应的第一Runnable对象,包括:读取所述目标线程执行的第二Runnable对象,并获取所述目标线程执行的第二Runnable对象包装前对应的第一Runnable对象;判断所述强引用队列中是否存在所述对应的第一Runnable对象;当所述强引用队列中存在所述对应的第一Runnable对象时,删除所述强引用队列中对应的第一Runnable对象;当所述强引用队列中不存在所述对应的第一Runnable对象时,执行所述目标线程的第二Runnable对象。这样,就解耦了Runnable对象对外部类的强引用,Runnable对象持有的外部类就能够得到释放,避免外部类的内存泄漏。
优选地,在所述使用代理模式将至少一个待执行的第一Runnable对象传入到所述静态可执行对象进行弱引用包装前,所述方法还包括:初始化自定义的所述静态可执行对象。
优选地,在将所述第一Runnable对象插入到所述强引用队列前,所述方法还包括:初始化自定义的所述强引用队列。
优选地,在将所述包装后的第二Runnable对象提交到线程池中等待执行前,所述方法还包括:初始化所述线程池。
本实施方式中,通过对自定义的所述静态可执行对象、自定义的所述强引用队列以及线程池进行初始化,方便复用,而且数据更加准确。
附图说明
一个或多个实施例通过与之对应的附图中的图片进行示例性说明,这些示例性说明并不构成对实施例的限定。
图1是根据本发明第一实施方式的防止内存泄漏方法的流程示意图;
图2是根据本发明第二实施方式的防止内存泄漏方法的流程示意图;
图3是根据本发明第三实施方式的防止内存泄漏装置的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合附图对本发明的各实施方式进行详细的阐述。然而,本领域的普通技术人员可以理解,在本发明各实施方式中,为了使读者更好地理解本申请而提出了许多技术细节。但是,即使没有这些技术细节和基于以下各实施方式的种种变化和修改,也可以实现本申请所要求保护的技术方案。
本发明的第一实施方式涉及一种防止内存泄漏方法,本实施方式的核心在于,对外部类中的待执行的Runnable对象先进行弱引用包装,加入到线程池中待执行,从而解耦待执行的Runnable对象对外部类的引用,避免外部类的内存泄漏。同时,建立强引用队列,用来保存待执行的Runnable对象,避免虚拟机垃圾回收导致目标线程中Runnable对象还没有执行就被销毁的问题。下面对本实施方式的防止内存泄漏方法的实现细节进行具体的说明,以下内容仅为方便理解提供的实现细节,并非实施本方案的必须。
本实施方式中的防止内存泄漏方法的流程示意图如图1所示,该方法应用于防止内存泄漏装置。
在本实施方式中,根据不同的需求,图1所示的流程图中的步骤的执行顺序可以改变,某些步骤可以省略。
步骤S101:自定义静态可执行对象,所述静态可执行对象实现Runnable接口。
现有技术中,在Java中有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口。虽然,通过Thread类和Runnable接口都可以实现多线程,但是两者区别在于,如果一个类继承Thread类,则不适合用于多线程资源共享,而实现了Runnable接口,就可以方便的实现多线程的资源共享。
本实施方式中,防止内存泄漏装置自定义一个静态可执行(StaticRunnable)对象,所述静态可执行对象实现Runnable接口。本实施方式中,静态可执行对象实现Runnable接口可以方便实现多线程的资源共享。
步骤S102:使用代理模式将至少一个待执行的第一Runnable对象传入到所述静态可执行对象进行弱引用包装,得到包装后的第二Runnable对象。
本实施例中,使用代理模式将外部类的至少一个待执行的第一Runnable对象传入到所述静态可执行对象进行弱引用包装。
类的实质是一种引用数据类型,类似于byte、short、int(char)、long、float、double等基本数据类型,不同的是,类是一种复杂的数据类型。因为类的本质是数据类型,而不是数据,所以不存在于内存中,不能被直接操作,只有被实例化为对象时,才会变得可操作。本实施方式中,外部类的实例化对象为待执行的第一Runnable对象。
本实施方式中,防止内存泄漏装置获取外部类中至少一个待执行的第一Runnable对象,使用代理模式将待执行的第一Runnable对象传入到静态可执行对象进行弱引用包装。
具体地,静态可执行对象定义了弱引用(WeakRefence)的属性mDelegate。静态可执行对象将传入的第一Runnable对象进行弱引用包装,并将该弱引用属性传给mDelegate属性。这样,实现了通过代理模式将待执行的第一Runnable对象传入到静态可执行对象进行弱引用包装。包装完成后得到包装后的第二Runnable对象。必须说明的是,第一、第二仅仅是为了方便Runnable对象名称的区分,并不对其功能进行限定。
进一步地,为了方便复用以及数据更加准确,在将至少一个待执行的第一Runnable对象传入到所述静态可执行对象进行弱引用包装前,初始化自定义的所述静态可执行对象。
为了便于对本发明的理解,下面对上述名词进行解释:
为了使程序能更加灵活地控制对象的生命周期,Java程序中对象的引用被划分为4种级别。这4种级别由高到低依次为:强引用(strongreference)、软引用(softreference)、弱引用(weakreference)和虚引用(Phantomreference)。强引用是使用最普遍的引用,如果一个对象具有强引用,那Java虚拟机的垃圾回收器(GarbageCollection,GC)绝不会回收这个对象,当内存空间不足,Java虚拟机宁愿抛出outofMmoryError错误,使程序异常终止,也不会靠随意回收具有强引用对象来解决内存不足的问题;如果对象具有软引用,则内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存;在垃圾回收器线程扫描所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存;如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
本实施方式中,将待执行的第一Runnable对象进行弱引用包装,这样一旦垃圾回收器发现了待执行的第一Runnable对象,不管当前内存空间足够与否,都会回收它的内存,如此,待执行的第一Runnable对象相当于无引用,这样解耦了待执行的第一Runnable对象对外部类的引用,第一Runnable对象所持有的外部类得以释放,从而避免外部类的内存泄漏。
步骤S103:自定义强引用队列,当所述第一Runnable对象包装完成后,将所述第一Runnable对象插入到所述强引用队列。
本实施方式中,防止内存泄漏装置自定义强引用队列ChainedRunnableHardRef,所述强引用队列用于保存所述待执行的第一Runnable对象。具体地,所述将所述第一Runnable对象插入到所述强引用队列,包括:判断所述强引用队列中是否存在所述第一Runnable对象;当所述强引用队列中不存在所述第一Runnable对象时,将所述第一Runnable对象插入到所述强引用队列。
进一步地,为了方便复用以及数据更加准确,在将所述第一Runnable对象插入到所述强引用队列前,初始化自定义的所述强引用队列。
步骤S104:将所述包装后的第二Runnable对象提交到线程池中等待执行。
本实施方式中,防止内存泄漏装置将包装后的第二Runnable对象提交到Java程序的线程池(例如,ScheduledExecutorService线程池)中等待执行。所有的包装后的第二Runnable对象在线程池中形成一个待执行的静态可执行(StaticRunnable)队列,所述静态可执行队列是弱引用包装后的第二Runnable对象引用队列。这样,本实施方式中,包括一个自定义的强引用队列,以及弱引用包装后的第二Runnable对象在线程池中形成的静态可执行(StaticRunnable)队列。由于线程池中的第二Runnable对象均是弱引用,随时可能被垃圾回收器回收,本实施方式中强引用队列也保存了第二Runnable对象包装前的第一Runnable对象,起到备份的作用,因此能够避免第二Runnable对象在执行前因为弱引用被销毁。
步骤S105:当所述线程池中目标线程开始执行时,删除所述目标线程执行的第二Runnable对象在所述强引用队列中对应的第一Runnable对象。
具体地,通过如下方式删除所述目标线程执行的第二Runnable对象在所述强引用队列中对应的第一Runnable对象:
防止内存泄漏装置读取所述目标线程执行的第二Runnable对象,并获取所述目标线程执行的第二Runnable对象包装前对应的第一Runnable对象;判断所述强引用队列中是否存在所述对应的第一Runnable对象;当所述强引用队列中存在所述对应的第一Runnable对象时,删除所述强引用队列中对应的第一Runnable对象;当所述强引用队列中不存在所述对应的第一Runnable对象时,执行所述目标线程的第二Runnable对象。
在优选的实施方式中,将外部类的待执行的第一Runnable对象传入到静态可执行对象进行弱引用包装,得到包装后的第二Runnable对象时,建立第一Runnable对象与第二Runnable对象的对应关系表。当所述线程池中目标线程开始执行时,防止内存泄漏装置读取所述目标线程执行的第二Runnable对象,根据对应关系表可以得到所述目标线程执行的第二Runnable对象包装前对应的第一Runnable对象。进一步地,防止内存泄漏装置删除强引用队列中的第一Runnable对象。这样,就解耦了第一Runnable对象对外部类的强引用,第一Runnable对象持有的外部类就能够得到释放,避免外部类的内存泄漏。
与现有技术相比,本发明实施方式,对外部类中的待执行的Runnable对象先进行弱引用包装,加入到线程池中待执行,从而解耦待执行的Runnable对象对外部类的引用,避免外部类的内存泄漏。同时,建立强引用队列,用来保存待执行的Runnable对象,避免虚拟机垃圾回收导致目标线程中Runnable对象还没有执行就被销毁的问题。
本发明的第二实施方式涉及一种防止内存泄漏方法。该方法应用于防止内存泄漏装置。第二实施方式是对本发明第一施方式的进一步改进,主要改进之处在于:当线程执行结束后,还判断是否还存在Runnable对象对外部类的强引用,当还存在Runnable对象对外部类的强引用时,启动报警程序,避免系统的crash问题。
本实施方式中的防止内存泄漏方法如图2所示,具体包括:
步骤S201:自定义静态可执行对象,所述静态可执行对象实现Runnable接口。
步骤S202:使用代理模式将至少一个待执行的第一Runnable对象传入到所述静态可执行对象进行弱引用包装,得到包装后的第二Runnable对象。
步骤S203:自定义强引用队列,当所述第一Runnable对象包装完成后,将所述第一Runnable对象插入到所述强引用队列。
步骤S204:将所述包装后的第二Runnable对象提交到线程池中等待执行。
步骤S205:当所述线程池中目标线程开始执行时,删除所述目标线程执行的第二Runnable对象在所述强引用队列中对应的第一Runnable对象。
本实施方式中,还包括步骤S206及S207,除此外步骤S201至步骤S205分别与第一实施方式中步骤S101至步骤S105大致相同,为避免重复,在此不再一一赘述。
步骤S206:当目标线程执行完成后,判断是否还存在目标线程对应的第一Runnable对象对外部类的强引用,当还存在目标线程对应的第一Runnable对象对外部类的强引用时,执行步骤S207。
步骤S207:启动报警程序进行报警。
本实施方式中,所述报警程序用来提醒程序开发人员,第一Runnable对象持有的外部类就还没得到释放,提醒程序人员进行处理,避免系统的crash问题。所述报警程序可以是在程序或系统界面进行文字提醒报错,也可以配合其他声光装置进行报警,本发明不作限定。
与现有技术相比,本发明实施方式,对外部类中的待执行的Runnable对象先进行弱引用包装,加入到线程池中待执行,从而解耦待执行的Runnable对象对外部类的引用,避免外部类的内存泄漏。同时,建立强引用队列,用来保存待执行的Runnable对象,避免虚拟机垃圾回收导致目标线程中Runnable对象还没有执行就被销毁的问题。
同时,与现有技术相比,本发明实施方式,只需改造线程池中执行线程的应用程序接口方法,就可以达到全局性的防止内存泄漏目标,彻底解决多线程的内存泄漏风险问题。代码量小,维护方便,也不存在由外部类在线程执行前被垃圾回收的问题。同时,当线程执行结束后,还判断是否还存在Runnable对象对外部类的强引用,当还存在Runnable对象对外部类的强引用时,启动报警程序,避免系统的crash问题。
上面各种方法的步骤划分,只是为了描述清楚,并不对步骤执行的先后顺序进行限定,而且实现时可以合并为一个步骤或者对某些步骤进行拆分,分解为多个步骤,只要包括相同的逻辑关系,都在本专利的保护范围内;对算法中或者流程中添加无关紧要的修改或者引入无关紧要的设计,但不改变其算法和流程的核心设计都在该专利的保护范围内。
本发明第三实施方式涉及一种防止内存泄漏装置,如图3所示,包括至少一个处理器301;以及,与至少一个处理器301通信连接的存储器302;其中,存储器302存储有可被至少一个处理器301执行的指令,指令被至少一个处理器301执行,以使至少一个处理器301能够执行上述的防止内存泄漏方法的步骤。
其中,处理器301和存储器302采用总线方式连接,总线可以包括任意数量的互联的总线和桥,总线将一个或多个处理器301和存储器302的各种电路连接在一起。总线还可以将诸如外围设备、稳压器和功率管理电路等之类的各种其他电路连接在一起,这些都是本领域所公知的,因此,本文不再对其进行进一步描述。总线接口在总线和收发机之间提供接口。收发机可以是一个元件,也可以是多个元件,比如多个接收器和发送器,提供用于在传输介质上与各种其他装置通信的单元。经处理器301处理的数据通过天线在无线介质上进行传输,进一步,天线还接收数据并将数据传送给处理器301。
处理器301负责管理总线和通常的处理,还可以提供各种功能,包括定时、外围接口、电压调节、电源管理以及其他控制功能。而存储器302可以被用于存储处理器301在执行操作时所使用的数据。
本发明的实施方式还提供了一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时实现上述防止内存泄漏方法的步骤。
即,本领域技术人员可以理解,实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序存储在一个存储介质中,包括若干指令用以使得一个设备(可以是单片机,芯片等)或处理器(processor)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
本领域的普通技术人员可以理解,上述各实施方式是实现本发明的具体实施例,而在实际应用中,可以在形式上和细节上对其作各种改变,而不偏离本发明的精神和范围。

Claims (10)

1.一种防止内存泄漏方法,其特征在于,包括:
自定义静态可执行对象,所述静态可执行对象实现Runnable接口;
使用代理模式将至少一个待执行的第一Runnable对象传入到所述静态可执行对象进行弱引用包装,得到包装后的第二Runnable对象;
自定义强引用队列,当所述第一Runnable对象包装完成后,将所述第一Runnable对象插入到所述强引用队列;
将所述包装后的第二Runnable对象提交到线程池中等待执行;
当所述线程池中目标线程开始执行时,读取所述目标线程执行的第二Runnable对象,删除所述目标线程执行的第二Runnable对象在所述强引用队列中对应的第一Runnable对象。
2.根据权利要求1所述的防止内存泄漏方法,其特征在于,所述方法还包括:
当目标线程执行完成后,判断是否还存在目标线程对应的第一Runnable对象对外部类的强引用;
当还存在目标线程对应的第一Runnable对象对外部类的强引用时,启动报警程序进行报警。
3.根据权利要求1所述的防止内存泄漏方法,其特征在于,所述使用代理模式将至少一个待执行的第一Runnable对象传入到所述静态可执行对象进行弱引用包装,包括:
包装所述待执行的第一Runnable对象为弱引用属性;
并将所述弱引用属性传给mDelegate属性。
4.根据权利要求1所述的防止内存泄漏方法,其特征在于,所述将所述第一Runnable对象插入到所述强引用队列,包括:
判断所述强引用队列中是否存在所述第一Runnable对象;
当所述强引用队列中不存在所述第一Runnable对象时,将所述第一Runnable对象插入到所述强引用队列。
5.根据权利要求1所述的防止内存泄漏方法,其特征在于,所述删除所述目标线程的第二Runnable对象在所述强引用队列中对应的第一Runnable对象,包括:
读取所述目标线程执行的第二Runnable对象,并获取所述目标线程执行的第二Runnable对象包装前对应的第一Runnable对象;
判断所述强引用队列中是否存在所述对应的第一Runnable对象;
当所述强引用队列中存在所述对应的第一Runnable对象时,删除所述强引用队列中对应的第一Runnable对象;
当所述强引用队列中不存在所述对应的第一Runnable对象时,执行所述目标线程的第二Runnable对象。
6.根据权利要求1所述的防止内存泄漏方法,其特征在于,在所述使用代理模式将至少一个待执行的第一Runnable对象传入到所述静态可执行对象进行弱引用包装前,所述方法还包括:
初始化自定义的所述静态可执行对象。
7.根据权利要求1所述的防止内存泄漏方法,其特征在于,在将所述第一Runnable对象插入到所述强引用队列前,所述方法还包括:
初始化自定义的所述强引用队列。
8.根据权利要求1所述的防止内存泄漏方法,其特征在于,在将所述包装后的第二Runnable对象提交到线程池中等待执行前,所述方法还包括:
初始化所述线程池。
9.一种防止内存泄漏装置,其特征在于,包括:
至少一个处理器;以及,
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如权利要求1至8中任一项所述的防止内存泄漏方法的步骤。
10.一种计算机可读存储介质,存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至8中任一项所述的防止内存泄漏方法的步骤。
CN202010888393.XA 2020-08-28 2020-08-28 防止内存泄漏方法、装置及计算机可读存储介质 Active CN112015395B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010888393.XA CN112015395B (zh) 2020-08-28 2020-08-28 防止内存泄漏方法、装置及计算机可读存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010888393.XA CN112015395B (zh) 2020-08-28 2020-08-28 防止内存泄漏方法、装置及计算机可读存储介质

Publications (2)

Publication Number Publication Date
CN112015395A true CN112015395A (zh) 2020-12-01
CN112015395B CN112015395B (zh) 2023-04-07

Family

ID=73502931

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010888393.XA Active CN112015395B (zh) 2020-08-28 2020-08-28 防止内存泄漏方法、装置及计算机可读存储介质

Country Status (1)

Country Link
CN (1) CN112015395B (zh)

Citations (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6047295A (en) * 1998-05-05 2000-04-04 International Business Machines Corporation Computer system, program product and method of managing weak references with a concurrent mark sweep collector
US20050204342A1 (en) * 2004-03-11 2005-09-15 International Business Machines Corp. Method, system and article for detecting memory leaks in Java software
CN101727355A (zh) * 2008-10-31 2010-06-09 国际商业机器公司 用于内存访问事件的处理方法和系统
US8301671B1 (en) * 2009-01-08 2012-10-30 Avaya Inc. Method and apparatus providing removal of replicated objects based on garbage collection
US20130080706A1 (en) * 2011-09-23 2013-03-28 International Business Machines Corporation Prevention of classloader memory leaks in multitier enterprise applications
US20130325912A1 (en) * 2012-05-31 2013-12-05 Vmware, Inc. Balloon object feedback for java virtual machines
US20140123134A1 (en) * 2012-10-26 2014-05-01 International Business Machines Corporation Virtual module-based ultra-lazy installation for modular systems
CN106528444A (zh) * 2016-12-05 2017-03-22 北京金和网络股份有限公司 内存缓存对象自动管理方法
CN106598725A (zh) * 2016-10-31 2017-04-26 武汉斗鱼网络科技有限公司 一种基于Android的Handler防内存泄漏装置及方法
CN107015866A (zh) * 2017-03-23 2017-08-04 腾讯科技(深圳)有限公司 一种数据处理方法及装置
CN109302639A (zh) * 2018-09-30 2019-02-01 武汉斗鱼网络科技有限公司 一种弹幕消息的分发方法、装置、终端和存储介质
CN109558308A (zh) * 2018-09-29 2019-04-02 中国平安人寿保险股份有限公司 应用程序内存泄露检测方法、装置、电子设备及存储介质
CN110457152A (zh) * 2019-07-11 2019-11-15 贵阳语玩科技有限公司 一种用代理模式解决内存泄露的系统和方法
CN111240956A (zh) * 2018-11-28 2020-06-05 阿里巴巴集团控股有限公司 内存泄漏监测方法、装置、电子设备及计算机存储介质

Patent Citations (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6047295A (en) * 1998-05-05 2000-04-04 International Business Machines Corporation Computer system, program product and method of managing weak references with a concurrent mark sweep collector
US20050204342A1 (en) * 2004-03-11 2005-09-15 International Business Machines Corp. Method, system and article for detecting memory leaks in Java software
CN101727355A (zh) * 2008-10-31 2010-06-09 国际商业机器公司 用于内存访问事件的处理方法和系统
US8301671B1 (en) * 2009-01-08 2012-10-30 Avaya Inc. Method and apparatus providing removal of replicated objects based on garbage collection
US20180232228A1 (en) * 2011-09-23 2018-08-16 International Business Machines Corporation Prevention of classloader memory leaks in multitier enterprise applications
US20130080706A1 (en) * 2011-09-23 2013-03-28 International Business Machines Corporation Prevention of classloader memory leaks in multitier enterprise applications
US20130325912A1 (en) * 2012-05-31 2013-12-05 Vmware, Inc. Balloon object feedback for java virtual machines
US20140123134A1 (en) * 2012-10-26 2014-05-01 International Business Machines Corporation Virtual module-based ultra-lazy installation for modular systems
CN106598725A (zh) * 2016-10-31 2017-04-26 武汉斗鱼网络科技有限公司 一种基于Android的Handler防内存泄漏装置及方法
CN106528444A (zh) * 2016-12-05 2017-03-22 北京金和网络股份有限公司 内存缓存对象自动管理方法
CN107015866A (zh) * 2017-03-23 2017-08-04 腾讯科技(深圳)有限公司 一种数据处理方法及装置
CN109558308A (zh) * 2018-09-29 2019-04-02 中国平安人寿保险股份有限公司 应用程序内存泄露检测方法、装置、电子设备及存储介质
CN109302639A (zh) * 2018-09-30 2019-02-01 武汉斗鱼网络科技有限公司 一种弹幕消息的分发方法、装置、终端和存储介质
CN111240956A (zh) * 2018-11-28 2020-06-05 阿里巴巴集团控股有限公司 内存泄漏监测方法、装置、电子设备及计算机存储介质
CN110457152A (zh) * 2019-07-11 2019-11-15 贵阳语玩科技有限公司 一种用代理模式解决内存泄露的系统和方法

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
夏永恒等: "Java终结器的分析", 《交通运输部管理干部学院学报》 *
张昊等: "Java软引用防止内存泄漏技术的研究", 《安徽教育学院学报》 *
程序员LF: "引用队列(ReferenceQueue)浅析", 《HTTPS://BLOG.CSDN.NET/LVERNIU777FUBIWEI/ARTICLE/DETAILS/53876211》 *

Also Published As

Publication number Publication date
CN112015395B (zh) 2023-04-07

Similar Documents

Publication Publication Date Title
US6542167B1 (en) System and method for flexible software linking
US8838928B2 (en) Memory management and method for allocation using free-list
US5774729A (en) Event handling in a high level programming language environment
EP3462324B1 (en) Pointers in a memory managed system
US8006246B2 (en) Apparatus for forcibly terminating thread blocked on input/output operation and method for the same
US9804962B2 (en) Garbage collection control in managed code
WO2001016730A2 (en) FIXING INCOMPATIBLE APPLICATIONS BY PROVIDING STUBS FOR APIs
US8078914B2 (en) Open error-handling system
JP2021530756A (ja) ポーズレスなガベージ・コレクションのための活性化フレームを表す方法および装置
US20100037094A1 (en) Application Failure Recovery
JP2006216027A (ja) 同じアイテムを表すデータ構造間で生データを転送するメカニズム
CN113342554B (zh) Io多路复用方法、介质、设备和操作系统
US9513969B2 (en) Method for the management of task execution in a computer system
US7228527B1 (en) Method and system for structuring a procedure
US10579520B2 (en) Multi-ring shared, traversable, and dynamic advanced database
CN112015395B (zh) 防止内存泄漏方法、装置及计算机可读存储介质
US8245005B2 (en) Probabilistic object relocation
US8745605B2 (en) Execution contexts with polymorphic type implementations
US8276165B2 (en) Continuation-based runtime callback invocation
US20080082971A1 (en) Method and apparatus for administering a process filesystem with respect to program code conversion
US11070377B1 (en) Blended virtual machine approach for flexible production delivery of intelligent business workflow rules
US10635416B2 (en) Property filtering
CN103677846A (zh) 一种SQLite数据库开发工具包及开发方法
CN111433738A (zh) 控制器事件队列
CN113326077A (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