CN112000471B - 内存优化方法及装置 - Google Patents
内存优化方法及装置 Download PDFInfo
- Publication number
- CN112000471B CN112000471B CN202010794497.4A CN202010794497A CN112000471B CN 112000471 B CN112000471 B CN 112000471B CN 202010794497 A CN202010794497 A CN 202010794497A CN 112000471 B CN112000471 B CN 112000471B
- Authority
- CN
- China
- Prior art keywords
- log
- memory
- thread
- heap memory
- structures
- 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
Links
- 230000015654 memory Effects 0.000 title claims abstract description 289
- 238000000034 method Methods 0.000 title claims abstract description 142
- 238000005457 optimization Methods 0.000 title claims abstract description 34
- 239000004744 fabric Substances 0.000 claims description 15
- 238000011084 recovery Methods 0.000 claims description 4
- 238000003491 array Methods 0.000 claims 1
- 238000010586 diagram Methods 0.000 description 6
- 230000006870 function Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 3
- 230000004048 modification Effects 0.000 description 3
- 238000004891 communication Methods 0.000 description 2
- 230000005526 G1 to G0 transition Effects 0.000 description 1
- 238000013473 artificial intelligence Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 239000002360 explosive Substances 0.000 description 1
- 238000013468 resource allocation Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation 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/5016—Allocation 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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/17—Details of further file system functions
- G06F16/172—Caching, prefetching or hoarding of files
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/17—Details of further file system functions
- G06F16/1734—Details of monitoring file system events, e.g. by the use of hooks, filter drivers, logs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation 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/5022—Mechanisms to release resources
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本申请提供的内存优化方法及装置,可以在嵌入式系统进入稳定阶段时,检测各进程中是否有未结束但是空闲的线程;如果有,则将空闲线程所占用的堆内存空间释放,以便其他线程使用。本申请方案中采用日志结构体对线程中输出的日志数据进行类型描述,当日志结构体数量少于进程中的线程数量时,需要额外申请新的日志结构体,保证每一个线程可以对应一个日志结构体。并且在释放的过程中,也需要释放新的日志结构体占用的堆内存空间以及空闲线程对应的堆内存空间。可见,本申请的方案能够增加堆内存空间的释放量,进而提高堆内存的使用率。
Description
技术领域
本申请涉及计算机技术领域,尤其涉及一种内存优化方法及装置。
背景技术
嵌入式系统由硬件和软件组成,是能够独立进行运作的器件。其软件内容只包括软件运行环境及其操作系统。硬件内容包括信号处理器、存储器、通信模块等在内的多方面的内容。相比于一般的计算机处理系统而言,嵌入式系统存在较大的差异性,不能实现大容量的存储功能,因此具有一定的资源局限性。
堆内存空间紧张是资源局限性的一个表现。即,当运行的进程过多时,分配给进程的堆内存空间较少,不能保证每个进程对应一个堆内存。而某个进程在空闲时也会继续占用其对应的一部分或者全部堆内存,被占用的堆内存得不到释放也无法被其他进程使用,进而使得堆内存的使用率大大降低。
当前普遍的解决方法是扩大内存容量,但是扩容又会增加一些费用。因此,如何能够优化堆内存,进而提高堆内存的使用率,成为本领域技术人员亟待解决的问题。
发明内容
本申请提供了一种内存优化方法及装置,以解决目前嵌入式系统中堆内存使用率低的问题。
第一方面,本申请提供了一种内存优化方法,包括:
在进程中所有线程的数量多于当前的日志结构体数量的情况下,额外申请新的日志结构体数组;所述日志结构体数组用于表示日志结构体的集合;所述日志结构体用于对所述线程中输出的日志数据进行类型描述;
为进程内的每一个线程分配一个日志结构体;
在第一预设时间过后,如果检测到在第二预设时间内存在没有日志数据输出的空闲线程,则回收所述空闲线程对应的日志结构体中的日志缓存指针;所述日志缓存指针用于指示所述线程对应的第一堆内存所在内存空间的地址;所述第一预设时间用于表示进程开始之后各个线程申请和主动释放第一堆内存的稳定时间;
释放所述日志缓存指针所对应的第一堆内存;所述第一堆内存用于表示内存中可以被动态申请的内存空间,以及所述第一堆内存用于存储所述线程输出的日志数据。
在一些实施例中,在所述为进程内的每一个线程分配一个日志结构体的步骤之后,还包括:
为所述新的日志结构体数组中预设数量的新日志结构体分别分配第一堆内存;其中,所述新日志结构体中的日志缓存指针指向不同第一堆内存的地址;并且,预设数量的新的日志结构体与当前日志结构体的总数量大于或者等于所述进程中所有线程的数量。
在一些实施例中,所述释放所述日志缓存指针所对应的第一堆内存的步骤包括:
计算预设数量的新日志结构体与当前日志结构体的结构体总数量;
获取当前活跃日志结构体的数量以及所述进程主动释放日志结构体的数量;所述当前活跃日志结构体用于表示当前活跃的线程对应的日志结构体;
通过计算所述结构体总数量减去活跃日志结构体的数量以及所述进程主动释放日志结构体的数量,确定释放的第一堆内存的总数量。
在一些实施例中,在所述在进程中所有线程的数量多于当前的日志结构体数量的情况下,额外申请新的日志结构体数组的步骤之后,还包括:
为每一个日志结构体分配第二堆内存,所述第二堆内存用于表示内存中可以被动态申请的内存空间,以及所述第二堆内存用于存储所述日志结构体。
在一些实施例中,在所述释放所述日志缓存指针所对应的第一堆内存的步骤之后,还包括:
释放额外申请的新的日志结构体数组中每个新日志结构体所占用的第二堆内存。
第二方面,本申请实施例还提供了另一种内存优化方法,包括:
在进程中所有线程的数量少于当前的日志结构体数量的情况下,为进程内的每一个线程分配一个日志结构体;所述日志结构体用于对所述线程中输出的日志数据进行类型描述;
在第一预设时间过后,如果检测到在第二预设时间内存在没有日志数据输出的空闲线程,则回收所述空闲线程对应的日志结构体中的日志缓存指针;所述日志缓存指针用于指示所述线程对应的第一堆内存所在内存空间的地址;所述第一预设时间用于表示进程开始之后各个线程申请和主动释放第一堆内存的稳定时间;
释放所述日志缓存指针所对应的第一堆内存;所述第一堆内存用于表示内存中可以被动态申请的内存空间,以及所述第一堆内存用于存储所述线程输出的日志数据。
第三方面,本申请提供了一种内存优化装置,包括:
结构体申请模块,用于在进程中所有线程的数量多于当前的日志结构体数量的情况下,额外申请新的日志结构体数组;所述日志结构体数组用于表示日志结构体的集合;所述日志结构体用于对所述线程中输出的日志数据进行类型描述;
结构体分配模块,用于为进程内的每一个线程分配一个日志结构体;
回收模块,用于在第一预设时间过后,如果检测到在第二预设时间内存在没有日志数据输出的空闲线程,则回收所述空闲线程对应的日志结构体中的日志缓存指针;所述日志缓存指针用于指示所述线程对应的第一堆内存所在内存空间的地址;所述第一预设时间用于表示进程开始之后各个线程申请和主动释放第一堆内存的稳定时间;
内存释放模块,用于释放所述日志缓存指针所对应的第一堆内存;所述第一堆内存用于表示内存中可以被动态申请的内存空间,以及所述第一堆内存用于存储所述线程输出的日志数据。
在一些实施例中,还包括:
内存分配模块,用于为所述新的日志结构体数组中预设数量的新日志结构体分别分配第一堆内存;其中,所述新日志结构体中的日志缓存指针指向不同第一堆内存的地址;并且,预设数量的新的日志结构体与当前日志结构体的总数量大于或者等于所述进程中所有线程的数量。
在一些实施例中,所述内存释放模块还用于:计算预设数量的新日志结构体与当前日志结构体的结构体总数量;获取当前活跃日志结构体的数量以及所述进程主动释放日志结构体的数量;所述当前活跃日志结构体用于表示当前活跃的线程对应的日志结构体;通过计算所述结构体总数量减去活跃日志结构体的数量以及所述进程主动释放日志结构体的数量,确定释放的第一堆内存的总数量。
第四方面,本申请还提供了另一种内存优化装置,包括:
结构体分配模块,用于在进程中所有线程的数量少于当前的日志结构体数量的情况下,为进程内的每一个线程分配一个日志结构体;所述日志结构体用于对所述线程中输出的日志数据进行类型描述;
回收模块,用于在第一预设时间过后,如果检测到在第二预设时间内存在没有日志数据输出的空闲线程,则回收所述空闲线程对应的日志结构体中的日志缓存指针;所述日志缓存指针用于指示所述线程对应的第一堆内存所在内存空间的地址;所述第一预设时间用于表示进程开始之后各个线程申请和主动释放第一堆内存的稳定时间;
内存释放模块,用于释放所述日志缓存指针所对应的第一堆内存;所述第一堆内存用于表示内存中可以被动态申请的内存空间,以及所述第一堆内存用于存储所述线程输出的日志数据。
由上述内容可知,本申请技术方案中的内存优化方法及装置,可以在嵌入式系统进入稳定阶段时,检测各进程中是否有未结束但是空闲的线程;如果有,则将空闲线程所占用的堆内存空间释放,以便其他线程使用。本申请方案中采用日志结构体对线程中输出的日志数据进行类型描述,当日志结构体数量少于进程中的线程数量时,需要额外申请新的日志结构体,保证每一个线程可以对应一个日志结构体。并且在释放的过程中,也需要释放新的日志结构体占用的堆内存空间以及空闲线程对应的堆内存空间。可见,本申请的方案能够增加堆内存空间的释放量,进而提高堆内存的使用率。
附图说明
为了更清楚地说明本申请的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例示出的一种内存优化方法的流程图;
图2为本申请实施例示出的一种日志结构体与堆内存关系的示意图;
图3为本申请实施例示出的另一种内存优化方法的流程图;
图4为本申请实施例示出的一种增加堆内存释放量的示意图;
图5为本申请实施例示出的一种内存优化装置的示意图。
具体实施方式
为使本申请的目的、实施方式和优点更加清楚,下面将结合本申请示例性实施例中的附图,对本申请示例性实施方式进行清楚、完整地描述,显然,所描述的示例性实施例仅是本申请一部分实施例,而不是全部的实施例。
基于本申请描述的示例性实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请所附权利要求保护的范围。此外,虽然本申请中公开内容按照示范性一个或几个实例来介绍,但应理解,可以就这些公开内容的各个方面也可以单独构成一个完整实施方式。
需要说明的是,本申请中对于术语的简要说明,仅是为了方便理解接下来描述的实施方式,而不是意图限定本申请的实施方式。除非另有说明,这些术语应当按照其普通和通常的含义理解。
本申请中说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”等是用于区别类似或同类的对象或实体,而不必然意味着限定特定的顺序或先后次序,除非另外注明(Unless otherwise indicated)。应该理解这样使用的用语在适当情况下可以互换,例如能够根据本申请实施例图示或描述中给出那些以外的顺序实施。
此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖但不排他的包含,例如,包含了一系列组件的产品或设备不必限于清楚地列出的那些组件,而是可包括没有清楚地列出的或对于这些产品或设备固有的其它组件。
本申请中使用的术语“模块”,是指任何已知或后来开发的硬件、软件、固件、人工智能、模糊逻辑或硬件或/和软件代码的组合,能够执行与该元件相关的功能。
嵌入式系统由硬件和软件组成,是能够独立进行运作的器件。其软件内容只包括软件运行环境及其操作系统。硬件内容包括信号处理器、存储器、通信模块等在内的多方面的内容。相比于一般的计算机处理系统而言,嵌入式系统存在较大的差异性,不能实现大容量的存储功能,因此具有一定的资源局限性。
堆内存空间紧张是资源局限性的一个表现。即,当运行的进程过多时,分配给进程的堆内存空间较少,不能保证每个进程对应一个堆内存。而某个进程在空闲时也会继续占用其对应的一部分或者全部堆内存,被占用的堆内存得不到释放也无法被其他进程使用,进而使得堆内存的使用率大大降低。当前普遍的解决方法是扩大内存容量,但是扩容又会增加一些费用。可见,目前嵌入式系统中堆内存使用率低。
基于上述内容,本申请实施例提供了一种内存优化方法及装置,可以在嵌入式系统进入稳定阶段时,检测各进程中是否有未结束但是空闲的线程;如果有,则将空闲线程所占用的堆内存空间释放,以便其他线程使用。进而增加堆内存空间的释放量,提高堆内存的使用率。
图1为本申请实施例示出的一种内存优化方法的流程图,如图1所示,该内存优化方法包括如下步骤:
步骤S101,在进程中所有线程的数量多于当前的日志结构体数量的情况下,额外申请新的日志结构体数组。
进程是系统资源分配的最小单位,线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。以一个进程为例,其中会涉及到多个线程并发进行,但是每条线程并行执行不同的任务。
本申请实施例主要针对进程中的线程进行检测,也通过日志结构体实现具体线程的调度和使用。其中,日志结构体还可以对线程中输出的日志数据进行类型描述。即,由日志结构体定义线程输出数据的类型以及输出数据的保存位置。
通常情况下,一个线程分配一个日志结构体使用。在嵌入式系统的初始状态时,系统当前的日志结构体通常有80条,或者说系统内初始具有一个包含80条日志结构体的日志结构体的数据,其中,日志结构体数组用于表示日志结构体的集合。本申请实施例中先以一个进程中的线程进行示例性说明,当一个进程内的进程数量多于当前的日志结构体数量时,说明有一些线程不能被分配到日志结构体,为了保证所有线程的正常运行,需要额外再申请新的日志结构体,通常日志结构体是以数组的形式存在,额外申请的应该是包含固定数量日志结构体的数组,例如100个日志结构体的数组等等。这样也能保证当前的日志结构体加上新的日志结构体的数量可以满足所有线程的分配。
步骤S102,为进程内的每一个线程分配一个日志结构体。
即,在上述申请了新的日志结构体数组后,可以保证每一个线程对应了一个日志结构体。
步骤S103,在第一预设时间过后,如果检测到在第二预设时间内存在没有日志数据输出的空闲线程,则回收空闲线程对应的日志结构体中的日志缓存指针。
线程输出的日志数据通常保存在内存空间的某一个堆内存中,本申请实施例中将保存日志数据的堆内存称为第一堆内存,其也是线程对应的堆内存。为了确定第一堆内存的位置,通常使用日志缓存指针保存第一堆内存的地址,进而线程可以根据日志缓存指针将日志数据存储在对应的第一堆内存中。
所述第一预设时间用于表示进程开始之后各个线程申请和主动释放第一堆内存的稳定时间。通常在嵌入式系统开机后的一段时间内,各个线程申请第一堆内存会呈现一个爆发式的增长过程,之后,随着各个线程的执行结束可以能会逐渐主动释放一些第一堆内存。
以嵌入式系统中运行了6个进程为例,在嵌入式系统开机后的125秒时,所有进程中的所有线程主动释放第一堆内存的情况趋于稳定,即在125秒之后,释放堆内存的数量不再变化,此时可以将125秒作为第一预设时间。但是由于在实际应用时,嵌入式系统中存在进程的数量难以确定,因此,需要将第一预设时间设置得长一些,例如5分钟,以保证所有进程和线程申请和主动释放第一堆内存进入稳定状态。通常来说,第一预设时间可以根据嵌入式系统的实际使用情况进行设置。
线程主动释放第一堆内存的时机通常是在线程执行结束之时,但是也有一些线程处于未结束但是也无日志数据输出的状态,这样的线程称之为空闲线程,空闲线程也会占用第一堆内存,导致第一堆内存被闲置也无法被其他线程使用。因此,本申请实施例中还需要设置第二预设时间,即为所有线程预留一个执行时间,等到大部分线程都执行结束后,再对空闲线程进行检测。通常一个线程执行的时间很快,所以第二预设时间可知设置得短一些,例如1分钟等。
步骤S104,释放所述日志缓存指针所对应的第一堆内存;所述第一堆内存用于表示内存中可以被动态申请的内存空间,以及所述第一堆内存用于存储所述线程输出的日志数据。
图2为本申请实施例示出的一种日志结构体与堆内存关系的示意图。如图2所示,日志结构体中包括日志缓存指针和日志其他信息,但是本申请实施例中主要利用日志缓存指针进行处理,其中日志缓存指针指向内存中的一个堆内存,这个堆内存即上述实施例中的第一堆内存,其内存空间为4080字节。
线程在执行时,其所使用的日志结构体需要使用一个4080字节的堆内存,用于存储线程执行后输出的日志数据。但是空闲线程不会主动释放其占用的第一堆内存,所以需要将空闲线程的日志缓存指针回收,在日志缓存指针被回收之后,其所指向的第一堆内存就会被释放,进而可以被其他需要内存的线程所使用。
由上述内容可知,本申请实施例提供的内存优化方法,可以释放空闲线程占用的堆内存,能够增加堆内存空间的释放量,进而提高堆内存的使用率。
上述实施例中,在进程中所有线程的数量多于当前的日志结构体数量的情况下,额外申请了新的日志结构体数组,这个日志结构体数组中并不是所有新的日志结构体都会被分配给线程使用,进而,需要选择其中一部分分配第一堆内存,再将分配好第一堆内存的日志结构体作为备选分配给线程。因此,在一些实施例中,在为进程内的每一个线程分配一个日志结构体的步骤之后,还可以为新的日志结构体数组中预设数量的新日志结构体分别分配第一堆内存;新日志结构体中的日志缓存指针指向不同第一堆内存的地址;并且,预设数量的新的日志结构体与当前日志结构体的总数量大于或者等于进程中所有线程的数量。
其中,预设数量可以根据线程实际存在的数量来确定,例如,线程有85条,而日志结构体只有80条,这时需要申请一个100条的日志结构体数组,那么可以选择给100条中的前20条日志结构体分配第一堆内存。此时,就有100个日志结构体占用了100个4080字节的堆内存,但是只有85个日志结构是被分配给了线程使用,还有15个日志结构体占用的15个4080字节的堆内存是完成闲置的。
而85个线程在申请和主动释放堆内进入稳定期之后,现存的占用堆内存的线程可能不满足85个,除去真正有日志数据输出的堆内存以外,还剩下一些未结束但是也无日志数据输出的空闲线程,例如,85个线程中主动释放堆内存的有16个,而真正有日志数据输出的活跃线程仅有21个,那么除去主动释放堆内存的线程和活跃线程之后,剩下的就是空闲线程。
本申请实施例中,需要检测到空闲线程,并且将空闲线程所占用的第一堆内存释放,但是在上述实施例中,由于还增加了新的日志结构体并且为预设数量的日志结构体也分配了一些第一堆内存的空间,这些预设数量的日志结构体可能不会被线程全部使用,那么在释放第一堆内存的时候,还需要将未被线程使用的日志结构体所占用的第一堆内存也释放出来。进而,在一些实施例中,还需要计算出包括空闲线程在内释放的所有第一堆内存的数量,可以包括如下步骤:
步骤S201,计算预设数量的新日志结构体与当前日志结构体的结构体总数量。
仍以上述示例进行说明,如果当前日结构体是80个,新的日结结构体中只给前20个日志结构体分配了第一堆内存,那么预设数量就是20个,此时结构体总数量为80+20。
步骤S202,获取当前活跃日志结构体的数量以及所述进程主动释放日志结构体的数量;所述当前活跃日志结构体用于表示当前活跃的线程对应的日志结构体。
步骤S203,通过计算所述结构体总数量减去活跃日志结构体的数量以及所述进程主动释放日志结构体的数量,确定释放的第一堆内存的总数量。
如果结构体总数量为80+20,当前活跃日志结构体的数量为21个,进程中线程主动释放日志结构体的数量为16个,那么可以计算出需要释放的第一堆内存的总数量为80+20-16-21=63。如果一个第一堆内存为4080字节,那么释放出的第一堆内存的总空间大小为63*4080=257040字节。
日志结构体本身也是一种数据类型,也需要占用一定的存储空间,通常嵌入式系统需要为一个日志结构体分配一个用于存储其本身的堆内存,例如36字节等,这个内存在本申请实施例中称之为第二堆内存。即,在一些实施例中,不论是当前存在的日志结构体还是额外申请的新的日志结构体数组,都需要为每一个日志结构体分配第二堆内存。其中,第二堆内存用于表示内存中可以被动态申请的内存空间,以及第二堆内存用于存储日志结构体。
本申请实施例中的第一堆内存与第二堆内存均是属于嵌入式系统内存中的存储空间,二者只是在存储空间大小上存在差别。
当然,如果本申请实施例中额外申请了新的日志结构体数组,那么为了增加堆内存的释放量,还需要将新的日志结构体数组中每个新日志结构体所占用的第二堆内存全部释放掉。因为在进程的稳定期,嵌入式系统初始存在的日志结构体数量大概率上足以满足还在活跃的线程使用,所以闲置的新的日志结构体就无需再占用第二堆内存。此时如果新的日志结构体有100条,那么最多可以释放的第二堆内存就有100*36=3600字节。
再加上前述释放出的第一堆内存,本申请实施例中的内存优化方法针对于上述示例,即线程有85条,而日志结构体只有80条的情况,可以释放的最多的内存空间大小为63*4080+100*36=257040+3600=260640字节。
上述实施例中均是以嵌入式系统中的一个进程为例进行说明,当嵌入式系统中存在若干进程运行时,本申请实施例中的内存优化方法能释放的堆内存的能力更加明显。例如,嵌入式系统中当前存在的15个进程,而每个进程如上所述都可以最多释放出260640字节的堆内存那么,15个进程一共可以最多释放出15*260640=3909600字节的堆内存。
另外,上述实施例中仅以额外申请了一次新的日志结构体数组为例进行说明,当线程数量持续增加时,也可以继续申请新的日志结构体,此时之前申请的日志结构体加上初始的日志结构体可以全部作为当前的日志结构体,重新进行上述实施例中的过程,同样可以实现更多释放堆内存的目的。
值得说明的是,前述实施例中的内存优化方法,是在进程中所有线程的数量多于当前的日志结构体数量的情况下进行的。当进程中所有线程的数量少于当前的日志结构体数量时,本申请实施例还提供了另一种内存优化方法。图3为本申请实施例示出的另一种内存优化方法的流程图,如图3所示,该方法可以包括如下步骤:
步骤S301,在进程中所有线程的数量少于当前的日志结构体数量的情况下,为进程内的每一个线程分配一个日志结构体;所述日志结构体用于对所述线程中输出的日志数据进行类型描述。
步骤S302,在第一预设时间过后,如果检测到在第二预设时间内存在没有日志数据输出的空闲线程,则回收所述空闲线程对应的日志结构体中的日志缓存指针;所述日志缓存指针用于指示所述线程对应的第一堆内存所在内存空间的地址;所述第一预设时间用于表示进程开始之后各个线程申请和主动释放第一堆内存的稳定时间。
步骤S303,释放所述日志缓存指针所对应的第一堆内存;所述第一堆内存用于表示内存中可以被动态申请的内存空间,以及所述第一堆内存用于存储所述线程输出的日志数据。
如图3所示的内存优化方法与上述如图1所示的内存优化方法的区别仅在于,在进程中所有线程的数量少于当前的日志结构体数量的情况下,图3所示的内存优化方法不再额外申请新的日志结构体,仅用现存的日志结构体就可以满足所有线程的分配需要,其余的内容均与图1所示的内存优化方法相同,在此不再赘述。
图4为本申请实施例示出的一种增加堆内存释放量的示意图。如图4所示,上述图1和图3所示的内存优化方法可以总体概括为:针对各个进程中的线程分别分配不同的第一堆内存,即,将各个线程的日志缓存指针指向各个第一堆内存;然后在第一预设时间之后,检测各个线程是否空闲,如果存在空闲线程,则将空闲线程的日志缓存指针回收,并释放该指针所指的第一堆内存。
由上述全部实施例的内容可知,上述内存优化方法可以在嵌入式系统进入稳定阶段时,检测各进程中是否有未结束但是空闲的线程;如果有,则将空闲线程所占用的堆内存空间释放,以便其他线程使用。本方法中采用日志结构体对线程中输出的日志数据进行类型描述,当日志结构体数量少于进程中的线程数量时,需要额外申请新的日志结构体,保证每一个线程可以对应一个日志结构体。并且在释放的过程中,也需要释放新的日志结构体占用的堆内存空间以及空闲线程对应的堆内存空间。可见,本方法能够增加堆内存空间的释放量,进而提高堆内存的使用率。
图5为本申请实施例示出的一种内存优化装置的示意图。如图5所示,该装置可以包括:结构体申请模块501,用于在进程中所有线程的数量多于当前的日志结构体数量的情况下,额外申请新的日志结构体数组;所述日志结构体数组用于表示日志结构体的集合;所述日志结构体用于对所述线程中输出的日志数据进行类型描述;结构体分配模块502,用于为进程内的每一个线程分配一个日志结构体;回收模块503,用于在第一预设时间过后,如果检测到在第二预设时间内存在没有日志数据输出的空闲线程,则回收所述空闲线程对应的日志结构体中的日志缓存指针;所述日志缓存指针用于指示所述线程对应的第一堆内存所在内存空间的地址;所述第一预设时间用于表示进程开始之后各个线程申请和主动释放第一堆内存的稳定时间;内存释放模块504,用于释放所述日志缓存指针所对应的第一堆内存;所述第一堆内存用于表示内存中可以被动态申请的内存空间,以及所述第一堆内存用于存储所述线程输出的日志数据。
在一些实施例中,上述内存优化装置还包括:内存分配模块,用于为所述新的日志结构体数组中预设数量的新日志结构体分别分配第一堆内存;其中,所述新日志结构体中的日志缓存指针指向不同第一堆内存的地址;并且,预设数量的新的日志结构体与当前日志结构体的总数量大于或者等于所述进程中所有线程的数量。
在一些实施例中,所述内存释放模块还用于:计算预设数量的新日志结构体与当前日志结构体的结构体总数量;获取当前活跃日志结构体的数量以及所述进程主动释放日志结构体的数量;所述当前活跃日志结构体用于表示当前活跃的线程对应的日志结构体;通过计算所述结构体总数量减去活跃日志结构体的数量以及所述进程主动释放日志结构体的数量,确定释放的第一堆内存的总数量。
在一些实施例中,内存分配模块还用于:为每一个日志结构体分配第二堆内存,所述第二堆内存用于表示内存中可以被动态申请的内存空间,以及所述第二堆内存用于存储所述日志结构体。
在一些实施例中,内存释放模块还用于:释放额外申请的新的日志结构体数组中每个新日志结构体所占用的第二堆内存。
另外,结构体申请模块还可以用于:在进程中所有线程的数量少于当前的日志结构体数量的情况下,直接为进程内的每一个线程分配一个日志结构体。
最后应说明的是:以上各实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述各实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的范围。
为了方便解释,已经结合具体的实施方式进行了上述说明。但是,上述示例性的讨论不是意图穷尽或者将实施方式限定到上述公开的具体形式。根据上述的教导,可以得到多种修改和变形。上述实施方式的选择和描述是为了更好的解释原理以及实际的应用,从而使得本领域技术人员更好的使用所述实施方式以及适于具体使用考虑的各种不同的变形的实施方式。
Claims (10)
1.一种内存优化方法,其特征在于,包括:
在进程中所有线程的数量多于当前的日志结构体数量的情况下,额外申请新的日志结构体数组;所述日志结构体数组用于表示日志结构体的集合;所述日志结构体用于对所述线程中输出的日志数据进行类型描述;
为进程内的每一个线程分配一个日志结构体;
在第一预设时间过后,如果检测到在第二预设时间内存在没有日志数据输出的空闲线程,则回收所述空闲线程对应的日志结构体中的日志缓存指针;所述日志缓存指针用于指示所述线程对应的第一堆内存所在内存空间的地址;所述第一预设时间用于表示进程开始之后各个线程申请和主动释放第一堆内存的稳定时间;
释放所述日志缓存指针所对应的第一堆内存;所述第一堆内存用于表示内存中可以被动态申请的内存空间,以及所述第一堆内存用于存储所述线程输出的日志数据。
2.根据权利要求1所述的方法,其特征在于,在所述为进程内的每一个线程分配一个日志结构体的步骤之后,还包括:
为所述新的日志结构体数组中预设数量的新日志结构体分别分配第一堆内存;所述新日志结构体中的日志缓存指针指向不同第一堆内存的地址;并且,预设数量的新的日志结构体与当前日志结构体的总数量大于或者等于所述进程中所有线程的数量。
3.根据权利要求2所述的方法,其特征在于,所述释放所述日志缓存指针所对应的第一堆内存的步骤包括:
计算预设数量的新日志结构体与当前日志结构体的结构体总数量;
获取当前活跃日志结构体的数量以及所述进程主动释放日志结构体的数量;所述当前活跃日志结构体用于表示当前活跃的线程对应的日志结构体;
通过计算所述结构体总数量减去活跃日志结构体的数量以及所述进程主动释放日志结构体的数量,确定释放的第一堆内存的总数量。
4.根据权利要求1所述的方法,其特征在于,在所述在进程中所有线程的数量多于当前的日志结构体数量的情况下,额外申请新的日志结构体数组的步骤之后,还包括:
为每一个日志结构体分配第二堆内存,所述第二堆内存用于表示内存中可以被动态申请的内存空间,以及所述第二堆内存用于存储所述日志结构体。
5.根据权利要求4所述的方法,其特征在于,在所述释放所述日志缓存指针所对应的第一堆内存的步骤之后,还包括:
释放额外申请的新的日志结构体数组中每个新日志结构体所占用的第二堆内存。
6.一种内存优化方法,其特征在于,包括:
在进程中所有线程的数量少于当前的日志结构体数量的情况下,为进程内的每一个线程分配一个日志结构体;所述日志结构体用于对所述线程中输出的日志数据进行类型描述;
在第一预设时间过后,如果检测到在第二预设时间内存在没有日志数据输出的空闲线程,则回收所述空闲线程对应的日志结构体中的日志缓存指针;所述日志缓存指针用于指示所述线程对应的第一堆内存所在内存空间的地址;所述第一预设时间用于表示进程开始之后各个线程申请和主动释放第一堆内存的稳定时间;
释放所述日志缓存指针所对应的第一堆内存;所述第一堆内存用于表示内存中可以被动态申请的内存空间,以及所述第一堆内存用于存储所述线程输出的日志数据。
7.一种内存优化装置,其特征在于,包括:
结构体申请模块,用于在进程中所有线程的数量多于当前的日志结构体数量的情况下,额外申请新的日志结构体数组;所述日志结构体数组用于表示日志结构体的集合;所述日志结构体用于对所述线程中输出的日志数据进行类型描述;
结构体分配模块,用于为进程内的每一个线程分配一个日志结构体;
回收模块,用于在第一预设时间过后,如果检测到在第二预设时间内存在没有日志数据输出的空闲线程,则回收所述空闲线程对应的日志结构体中的日志缓存指针;所述日志缓存指针用于指示所述线程对应的第一堆内存所在内存空间的地址;所述第一预设时间用于表示进程开始之后各个线程申请和主动释放第一堆内存的稳定时间;
内存释放模块,用于释放所述日志缓存指针所对应的第一堆内存;所述第一堆内存用于表示内存中可以被动态申请的内存空间,以及所述第一堆内存用于存储所述线程输出的日志数据。
8.根据权利要求7所述的装置,其特征在于,还包括:
内存分配模块,用于为所述新的日志结构体数组中预设数量的新日志结构体分别分配第一堆内存;其中,所述新日志结构体中的日志缓存指针指向不同第一堆内存的地址;并且,预设数量的新的日志结构体与当前日志结构体的总数量大于或者等于所述进程中所有线程的数量。
9.根据权利要求8所述的装置,其特征在于,所述内存释放模块还用于:计算预设数量的新日志结构体与当前日志结构体的结构体总数量;获取当前活跃日志结构体的数量以及所述进程主动释放日志结构体的数量;所述当前活跃日志结构体用于表示当前活跃的线程对应的日志结构体;通过计算所述结构体总数量减去活跃日志结构体的数量以及所述进程主动释放日志结构体的数量,确定释放的第一堆内存的总数量。
10.一种内存优化装置,其特征在于,包括:
结构体分配模块,用于在进程中所有线程的数量少于当前的日志结构体数量的情况下,为进程内的每一个线程分配一个日志结构体;所述日志结构体用于对所述线程中输出的日志数据进行类型描述;
回收模块,用于在第一预设时间过后,如果检测到在第二预设时间内存在没有日志数据输出的空闲线程,则回收所述空闲线程对应的日志结构体中的日志缓存指针;所述日志缓存指针用于指示所述线程对应的第一堆内存所在内存空间的地址;所述第一预设时间用于表示进程开始之后各个线程申请和主动释放第一堆内存的稳定时间;
内存释放模块,用于释放所述日志缓存指针所对应的第一堆内存;所述第一堆内存用于表示内存中可以被动态申请的内存空间,以及所述第一堆内存用于存储所述线程输出的日志数据。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010794497.4A CN112000471B (zh) | 2020-08-10 | 2020-08-10 | 内存优化方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010794497.4A CN112000471B (zh) | 2020-08-10 | 2020-08-10 | 内存优化方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112000471A CN112000471A (zh) | 2020-11-27 |
CN112000471B true CN112000471B (zh) | 2023-10-27 |
Family
ID=73463360
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010794497.4A Active CN112000471B (zh) | 2020-08-10 | 2020-08-10 | 内存优化方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112000471B (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5815727A (en) * | 1994-12-20 | 1998-09-29 | Nec Corporation | Parallel processor for executing plural thread program in parallel using virtual thread numbers |
CN1752949A (zh) * | 2004-09-24 | 2006-03-29 | 上海贝尔阿尔卡特股份有限公司 | 内存管理系统及方法 |
CN101539870A (zh) * | 2008-03-21 | 2009-09-23 | 中兴通讯股份有限公司 | 内存泄漏检测装置及方法 |
CN106681933A (zh) * | 2016-11-16 | 2017-05-17 | 深圳市金立通信设备有限公司 | 一种内存管理方法及终端 |
CN107766123A (zh) * | 2017-10-11 | 2018-03-06 | 郑州云海信息技术有限公司 | 一种jvm调优方法 |
-
2020
- 2020-08-10 CN CN202010794497.4A patent/CN112000471B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5815727A (en) * | 1994-12-20 | 1998-09-29 | Nec Corporation | Parallel processor for executing plural thread program in parallel using virtual thread numbers |
CN1752949A (zh) * | 2004-09-24 | 2006-03-29 | 上海贝尔阿尔卡特股份有限公司 | 内存管理系统及方法 |
CN101539870A (zh) * | 2008-03-21 | 2009-09-23 | 中兴通讯股份有限公司 | 内存泄漏检测装置及方法 |
CN106681933A (zh) * | 2016-11-16 | 2017-05-17 | 深圳市金立通信设备有限公司 | 一种内存管理方法及终端 |
CN107766123A (zh) * | 2017-10-11 | 2018-03-06 | 郑州云海信息技术有限公司 | 一种jvm调优方法 |
Non-Patent Citations (1)
Title |
---|
面向嵌入式实时系统的动态内存管理方法研究;李志军;《中国优秀硕士学位论文全文数据库》(第第05期期);第1-58页 * |
Also Published As
Publication number | Publication date |
---|---|
CN112000471A (zh) | 2020-11-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108459898B (zh) | 一种资源回收方法及装置 | |
US9086952B2 (en) | Memory management and method for allocation using free-list | |
JP6014925B2 (ja) | メモリ回収方法および装置 | |
CN101971146B (zh) | 改进作为管理程序来宾而运行的虚拟机中内存使用情况的系统和方法 | |
US9081702B2 (en) | Working set swapping using a sequentially ordered swap file | |
JP5868429B2 (ja) | 領域に基づくガベージ・コレクタを用いてクラスを漸進的にアンロードするための方法、コンピュータ・プログラム製品、および装置 | |
EP3239844A1 (en) | Processing method and device for memory page in memory | |
CN111522659B (zh) | 一种空间使用方法和装置 | |
EP3252595A1 (en) | Method and device for running process | |
US8972629B2 (en) | Low-contention update buffer queuing for large systems | |
US8966212B2 (en) | Memory management method, computer system and computer readable medium | |
US20060236065A1 (en) | Method and system for variable dynamic memory management | |
CN112650449B (zh) | 缓存空间的释放方法、释放系统、电子设备及存储介质 | |
CN103593606B (zh) | 上下文信息管理方法及系统 | |
CN112000471B (zh) | 内存优化方法及装置 | |
US8990537B2 (en) | System and method for robust and efficient free chain management | |
CN111400032A (zh) | 一种资源分配的方法及装置 | |
CN113254186A (zh) | 一种进程调度方法、调度器及存储介质 | |
CN113867925A (zh) | 内存管理方法、装置、设备和存储介质 | |
CN115129459A (zh) | 一种内存管理的方法及设备 | |
KR20150136811A (ko) | 임베디드 시스템에서 메모리 관리 장치 및 방법 | |
CN116719609A (zh) | 一种JavaScript引擎的性能优化方法 | |
CN106326170A (zh) | 一种设备索引号分配方法、装置及系统 | |
CN116382574A (zh) | Buffer管理方法、装置及存储设备 | |
KR20130124840A (ko) | 메모리 할당 방법 및 해제 방법을 포함하는 효율적인 메모리 관리 방법 |
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 | ||
TA01 | Transfer of patent application right | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20221031 Address after: 83 Intekte Street, Devon, Netherlands Applicant after: VIDAA (Netherlands) International Holdings Ltd. Address before: No.02-2, 13th floor, building B2, phase 4.1, software industry, No.1, East Road, Donghu New Technology Development Zone, Wuhan, Hubei Province Applicant before: Hisense Electronic Technology (Wuhan) Co.,Ltd. |
|
GR01 | Patent grant | ||
GR01 | Patent grant |