CN108958943B - 内存释放方法及装置 - Google Patents
内存释放方法及装置 Download PDFInfo
- Publication number
- CN108958943B CN108958943B CN201810828812.3A CN201810828812A CN108958943B CN 108958943 B CN108958943 B CN 108958943B CN 201810828812 A CN201810828812 A CN 201810828812A CN 108958943 B CN108958943 B CN 108958943B
- Authority
- CN
- China
- Prior art keywords
- javascript
- java
- layer
- handle
- memory
- 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
Images
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
- 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)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
本公开是关于一种内存释放方法及装置,属于计算机技术领域。所述方法包括:Java层将Java对象转换为JavaScript句柄对象,并重写JavaScript句柄对象的释放方法;JavaScript层生成JavaScript原生对象;当释放JavaScript原生对象占用的内存后,Java层释放JavaScript句柄对象对应的Java对象占用的内存。本公开中Java层将Java对象转换为JavaScript句柄对象,并重写JavaScript句柄对象的释放方法,进而由JavaScript层根据JavaScript句柄对象生成与Java对象对应的JavaScript原生对象,当JavaScript层释放JavaScript原生对象占用的内存时,基于重写的释放方法,Java层也将释放Java对象占用的内存,从而避免Java层内存泄露,提升了系统性能。
Description
技术领域
本公开涉及计算机技术领域,尤其涉及一种内存释放方法及装置。
背景技术
快应用是指与系统深度整合的、能够提供场景化体验的新型应用,快应用具有无需安装,即搜即用等特点,其面向用户端提供各种JavaScript功能接口,基于这些JavaScript功能接口,系统内的JavaScript层通过与Java层进行数据交互,可向用户提供各种服务,并使用户获得与原生应用相同的体验效果。由于JavaScript层与Java层的内存是有限的,在JavaScript层与Java层进行数据交互后,为了避免内存泄露,降低提升系统性能,需要JavaScript层和Java层释放所交互的数据占用的内存。
发明内容
为克服相关技术中存在的问题,本公开提供一种内存释放方法及装置。
根据本公开实施例的第一方面,提供一种内存释放方法,所述方法包括:
JavaScript层调用JavaScript功能接口在Java层创建Java对象;
所述Java层将所述Java对象转换为JavaScript句柄对象,通过所述JavaScript功能接口将所述JavaScript句柄对象发送至所述JavaScript层,并重写所述JavaScript句柄对象的释放方法;
所述JavaScript层根据所述JavaScript句柄对象,生成JavaScript原生对象;
当释放所述JavaScript原生对象占用的内存后,所述JavaScript层向所述Java层发送内存释放消息,所述内存释放消息包括所述JavaScript句柄对象;
当接收到所述内存释放消息时,所述Java层基于重写的所述JavaScript句柄对象的释放方法,释放所述JavaScript句柄对象对应的所述Java对象占用的内存。
在本公开的另一个实施例中,所述JavaScript层调用JavaScript功能接口在Java层创建Java对象,包括:
所述JavaScript层通过调用所述JavaScript功能接口的构造函数在所述Java层创建Java对象。
在本公开的另一个实施例中,所述JavaScript层调用JavaScript功能接口在Java层创建Java对象,包括:
所述JavaScript层通过调用所述JavaScript功能接口的普通方法在所述Java层创建Java对象。
在本公开的另一个实施例中,所述Java层将所述Java对象转换为JavaScript句柄对象,包括:
所述Java层采用接口对象管理器将所述Java对象转换为JavaScript句柄对象,所述接口对象管理器用于将Java对象转换为JavaScript句柄对象。
在本公开的另一个实施例中,所述通过所述JavaScript功能接口将所述JavaScript句柄对象发送至所述JavaScript层之前,还包括:
所述Java层更改向所述JavaScript层返回值的Map,以使所述Java层能够通过所述JavaScript功能接口将所述JavaScript句柄对象发送至所述JavaScript层。
在本公开的另一个实施例中,所述JavaScript句柄对象包括所述Java对象对应的JavaScript原生对象属性,所述JavaScript层根据所述JavaScript句柄对象,生成JavaScript原生对象,包括:
所述JavaScript层根据所述JavaScript原生类型属性,生成JavaScript原生对象。
在本公开的另一个实施例中,所述当接收到所述内存释放消息时,所述Java层基于重写的所述JavaScript句柄对象的释放方法,释放所述JavaScript句柄对象对应的所述Java对象占用的内存,包括:
当接收到所述内存释放消息时,所述Java层基于重写的所述JavaScript句柄对象的释放方法,将所述JavaScript句柄对象从所述接口对象管理器中删除,并释放所述JavaScript句柄对象对应的所述Java对象占用的内存。
在本公开的另一个实施例中,所述JavaScript层根据所述JavaScript句柄对象,生成JavaScript原生对象之后,还包括:
在所述JavaScript原生对象的应用场景下,所述JavaScript层通过所述JavaScript功能接口向所述Java层发送调用消息,所述调用消息包括所述JavaScript句柄对象;
当接收到所述调用消息时,所述Java层获取所述JavaScript句柄对象对应的Java对象,以实现相应功能。
根据本公开实施例的第二方面,提供一种内存释放装置,所述装置包括:JavaScript层和Java层;
对象创建模块,用于调用JavaScript功能接口在所述Java层创建Java对象;
对象转换模块,用于将所述Java对象转换为JavaScript句柄对象,通过所述JavaScript功能接口将所述JavaScript句柄对象发送至所述JavaScript层,并重写所述JavaScript句柄对象的释放方法;
对象生成模块,用于根据所述JavaScript句柄对象,生成JavaScript原生对象;
发送模块,用于当释放所述JavaScript原生对象占用的内存后,向所述Java层发送内存释放消息,所述内存释放消息包括所述JavaScript句柄对象;
内存释放模块,用于当接收到所述内存释放消息时,基于重写的所述JavaScript句柄对象的释放方法,释放所述JavaScript句柄对象对应的所述Java对象占用的内存。
在本公开的另一个实施例中,所述对象创建模块,用于通过调用所述JavaScript功能接口的构造函数在所述Java层创建Java对象。
在本公开的另一个实施例中,所述对象创建模块,用于通过调用所述JavaScript功能接口的普通方法在所述Java层创建Java对象。
在本公开的另一个实施例中,所述对象转换模块,用于采用接口对象管理器将所述Java对象转换为JavaScript句柄对象,所述接口对象管理器用于将Java对象转换为JavaScript句柄对象。
在本公开的另一个实施例中,所述装置还包括:
更改模块,用于更改向所述JavaScript层返回值的Map,以使所述Java层能够通过所述JavaScript功能接口将所述JavaScript句柄对象发送至所述JavaScript层。
在本公开的另一个实施例中,所述JavaScript句柄对象包括所述Java对象对应的JavaScript原生对象属性;
所述对象生成模块,用于根据所述JavaScript原生类型属性,生成JavaScript原生对象。
在本公开的另一个实施例中,所述内存释放模块,用于当接收到所述内存释放消息时,基于重写的所述JavaScript句柄对象的释放方法,将所述JavaScript句柄对象从所述接口对象管理器中删除,并释放所述JavaScript句柄对象对应的所述Java对象占用的内存。
在本公开的另一个实施例中,所述装置还包括:
所述发送模块,用于在所述JavaScript原生对象的应用场景下,通过所述JavaScript功能接口向所述Java层发送调用消息,所述调用消息包括所述JavaScript句柄对象;
获取模块,用于当接收到所述调用消息时,获取所述JavaScript句柄对象对应的Java对象,以实现相应功能。
根据本公开实施例的第三方面,提供一种内存释放装置,包括:
处理器;
用于存储处理器可执行的指令的存储器;
其中,所述处理器被配置为:
JavaScript层调用JavaScript功能接口在Java层创建Java对象;
所述Java层将所述Java对象转换为JavaScript句柄对象,通过所述JavaScript功能接口将所述JavaScript句柄对象发送至所述JavaScript层,并重写所述JavaScript句柄对象的释放方法;
所述JavaScript层根据所述JavaScript句柄对象,生成JavaScript原生对象;
当释放所述JavaScript原生对象占用的内存后,所述JavaScript层向所述Java对象发送内存释放消息,所述内存释放消息包括所述JavaScript句柄对象;
当接收到所述内存释放消息时,所述Java层基于重写的所述JavaScript句柄对象的释放方法,释放所述JavaScript句柄对象对应的所述Java对象占用的内存。
本公开的实施例提供的技术方案可以包括以下有益效果:
Java层将Java对象转换为JavaScript句柄对象,并重写JavaScript句柄对象的释放方法,进而由JavaScript层根据JavaScript句柄对象生成与Java对象对应的JavaScript原生对象,当JavaScript层释放JavaScript原生对象占用的内存时,基于重写的释放方法,Java层也将释放Java对象占用的内存,从而避免Java层内存泄露,提升了系统性能。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。
图1是根据一示例性实施例示出的一种内存释放方法的流程图。
图2是根据一示例性实施例示出的一种内存释放方法的流程图。
图3是根据一示例性实施例示出的一种内存释放装置的框图。
图4是根据一示例性实施例示出的一种内存释放装置的框图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
图1是根据一示例性实施例示出的一种内存释放方法的流程图,如图1所示,内存释放方法用于终端中,该终端包括JavaScript层和Java层,该方法包括以下步骤。
在步骤S101中,JavaScript层调用JavaScript功能接口在Java层创建Java对象。
在步骤S102中,Java层将Java对象转换为JavaScript句柄对象,通过JavaScript功能接口将JavaScript句柄对象发送至JavaScript层,并重写JavaScript句柄对象的释放方法。
在步骤S103中,JavaScript层根据JavaScript句柄对象,生成JavaScript原生对象。
在步骤S104中,当释放JavaScript原生对象占用的内存后,JavaScript层向Java对象发送内存释放消息,内存释放消息包括JavaScript句柄对象。
在步骤S105中,当接收到内存释放消息时,Java层基于重写的JavaScript句柄对象的释放方法,释放JavaScript句柄对象对应的Java对象占用的内存。
本公开实施例提供的方法,Java层将Java对象转换为JavaScript句柄对象,并重写JavaScript句柄对象的释放方法,进而由JavaScript层根据JavaScript句柄对象生成与Java对象对应的JavaScript原生对象,当JavaScript层释放JavaScript原生对象占用的内存时,基于重写的释放方法,Java层也将释放Java对象占用的内存,从而避免Java层内存泄露,提升了系统性能。
在本公开的另一个实施例中,JavaScript层调用JavaScript功能接口在Java层创建Java对象,包括:
JavaScript层通过调用JavaScript功能接口的构造函数在Java层创建Java对象。
在本公开的另一个实施例中,JavaScript层调用JavaScript功能接口在Java层创建Java对象,包括:
JavaScript层通过调用JavaScript功能接口的普通方法在Java层创建Java对象。
在本公开的另一个实施例中,Java层将Java对象转换为JavaScript句柄对象,包括:
Java层采用接口对象管理器将Java对象转换为JavaScript句柄对象,接口对象管理器用于将Java对象转换为JavaScript句柄对象。
在本公开的另一个实施例中,通过JavaScript功能接口将JavaScript句柄对象发送至JavaScript层之前,还包括:
Java层更改向JavaScript层返回值的Map,以使Java层能够通过JavaScript功能接口将JavaScript句柄对象发送至JavaScript层。
在本公开的另一个实施例中,JavaScript句柄对象包括Java对象对应的JavaScript原生对象属性,JavaScript层根据JavaScript句柄对象,生成JavaScript原生对象,包括:
JavaScript层根据JavaScript原生类型属性,生成JavaScript原生对象。
在本公开的另一个实施例中,当接收到内存释放消息时,Java层基于重写的JavaScript句柄对象的释放方法,释放JavaScript句柄对象对应的Java对象占用的内存,包括:
当接收到内存释放消息时,Java层基于重写的JavaScript句柄对象的释放方法,将JavaScript句柄对象从接口对象管理器中删除,并释放JavaScript句柄对象对应的Java对象占用的内存。
在本公开的另一个实施例中,JavaScript层根据JavaScript句柄对象,生成JavaScript原生对象之后,还包括:
在JavaScript原生对象的应用场景下,JavaScript层通过JavaScript功能接口向Java层发送调用消息,调用消息包括JavaScript句柄对象;
当接收到调用消息时,Java层获取JavaScript句柄对象对应的Java对象,以实现相应功能。
上述所有可选技术方案,可以采用任意结合形成本公开的可选实施例,在此不再一一赘述。
图2是根据一示例性实施例示出的一种内存释放方法的流程图,如图2所示,内存释放方法用于终端中,该终端可以为智能手机、平板电脑、笔记本电脑等。该终端所支持的操作系统可以为安卓系统、Windows系统、IOS系统等。在快应用的操作场景下,该终端包括内存释放装置,该内存释放装置包括JavaScript层和Java层,该方法包括以下步骤。
在步骤S201中,JavaScript层调用JavaScript功能接口在Java层创建Java对象。
其中,JavaScript功能接口为JavaScript层所提供的功能接口,每个JavaScript功能接口能够实现快应用中的一种功能。当因业务需求,需要实现快应用中的某种功能时,JavaScript层可调用相应的JavaScript功能接口在Java层创建Java对象,进而通过调用Java对象执行相应操作,以实现该功能。
具体地,JavaScript层调用JavaScript功能接口在Java层创建Java对象的方式,包括但不限于如下两种:
第一种方式、JavaScript层通过调用JavaScript功能接口的构造函数在Java层创建Java对象。
其中,构造函数也称为构造方法,在创建对象时由系统自动调用,用于实现对象的初始化。构造函数作为一种特殊的方法,其函数名必须与类名相同,且不带返回值,也可以认为构造函数返回的就是这个类本身的一个对象。构造函数作为一个类的入口,当使用new关键字新建一个类的实例时,类加载器会首先调用这个类的构造函数,进而基于构造函数构造成这个类的一个实例。
在本公开实施例中,当JavaScript层因业务需求需要Java层返回一个对象时,JavaScript层调用相应的JavaScript功能接口与Java层进行通信,在通信过程中向Java层发送用于构造对象的各种参数,JavaScript层在调用JavaScript功能接口时,自动调用JavaScript功能接口的构造函数,进而根据所接收到的各种参数,同步创建出该JavaScript功能接口的Java对象,该Java对象为实际的工作对象,用于执行操作,以实现某种具体的功能。在实际应用中,JavaScript层可以定义_ctor方法为构造函数,进而采用_ctor方法同步在Java层构建一个Java对象。
第二种方式、JavaScript层通过调用JavaScript功能接口的普通方法在Java层创建Java对象。
其中,普通方法也称为普通函数,普通函数的函数名可以与构造函数的函数名相同,也可以不同。普通函数必须带有返回值,且需要void来修饰。此外,普通函数可以被重写,也可以被重载。void是C语言中的一个关键字,常用在程序编写中对定义函数的参数类型、返回值、函数中指针类型进行声明,有注释和限制程序的作用。void*可以指向任何类型的数据,在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。
在本公开实施例中,当JavaScript层因业务需求需要Java层返回一个对象时,JavaScript层调用任一JavaScript功能接口与Java层进行通信,在通信过程中向Java层发送用于构造对象的各种参数,JavaScript层在调用该JavaScript功能接口时,调用普通函数,并根据所接收到的各种参数,创建该JavaScript功能接口或其他JavaScript功能接口的Java对象。
当然,除了采用上述两种方式调用JavaScript功能接口在Java层创建Java对象外,还可以采用其他方式,本公开实施例对此不作具体的限定。
另外,需要说明的是,本公开实施例所创建的Java对象具有两种方法(在计算机领域方法可以理解为功能),分别为返回接口名称和释放对象资源等方法。
在步骤S202中,Java层将Java对象转换为JavaScript句柄对象。
在计算机技术领域,受限于JavaScript层和Java层之间的通信协议,Java层所创建的Java对象无法通过JavaScript功能接口发送至JavaScript层,且JavaScript层需要Java层返回的是JavaScript原生对象,而JavaScript原生对象只能在JavaScript线程中创建,因此,Java层在创建Java对象后,还需要将Java对象转换为JavaScript层能够识别且可用于创建JavaScript原生对象的JavaScript句柄对象。
基于上述需求,本公开实施例可预先定义一个接口对象管理器,该接口对象管理器具有多种功能,包括将Java对象转换为JavaScript句柄对象的功能,还包括管理Java对象与JavaScript句柄对象的功能等。
基于预先定义的接口对象管理器,JavaScript层调用JavaScript功能接口在Java层创建Java对象后,Java层即可采用该接口对象管理器将Java对象转换为JavaScript句柄对象。
由于本公开实施例中提供的数据交互方法在实现具体的功能时,需要借助Java对象与JavaScript句柄对象之间的对应关系,调用相应的Java对象,因此,为了便于后续应用,接口对象管理器将Java对象转换为JavaScript句柄对象之后,还可应用其管理功能,存储Java对象与JavaScript句柄对象之间的对应关系。当然,为了节省存储空间,减少内存占用量,提升系统性能,接口对象管理器在存储Java对象与JavaScript句柄对象之间的对应关系时,可存储Java对象名称与JavaScript句柄对象ID(identity,身份标识)之间的对应关系。
在步骤S203中,Java层更改向JavaScript层返回值的Map,并通过JavaScript功能接口将JavaScript句柄对象发送至JavaScript层。
为了能够成功地将JavaScript句柄对象发送在JavaScript层,Java层还需要更改Java层向JavaScript层返回值的Map,使得更改后的Map支持JavaScript句柄对象,从而在Java层向JavaScript层返回数据时,能够将JavaScript句柄对象发送至JavaScript层。
其中,Map是Java提供的一种通用的元素存储方式,Map为一种集合类,用于存储键值对(“键”、“值”),即Map<key,value>,Map中每个键映射到一个值。
在步骤S204中,Java层重写JavaScript句柄对象的释放方法。
考虑到随着业务需求,JavaScript层在Java层创建的Java对象的数量越来越多,而Java层内存是有限的,随着创建的Java对象数量越来越多,Java层内存占用量越来越大,相应地,JavaScript层所创建的JavaScript原生对象数量也越来越多,对于JavaScript层,因其可采用JavaScript原生对象的内存释放方法(release方法)及时释放不再使用的JavaScript原生对象,而Java层因无法获知JavaScript层中JavaScript原生对象的使用情况,因而无法及时释放不再使用的Java对象所占用内存,导致内存发生泄漏,减低了系统性能。为了解决该问题,当将Java对象转换为JavaScript句柄对象后,Java层还将重写JavaScript句柄对象的释放方法,在执行原有JavaScript原生对象的内存释放方法时,执行Java对象释放方法,从而可在释放JavaScript原生对象占用的内存时,释放该JavaScript原生对象对应的JavaScript句柄对象所对应的Java对象占用的内存。
在步骤S205中,JavaScript层根据JavaScript句柄对象,生成JavaScript原生对象。
由于JavaScript层需要获取的是与Java对象具有相同功能,但隶属于不同层的JavaScript原生对象,因此,为使JavaScript层能够生成JavaScript原生对象,Java层所转换的JavaScript句柄对象应当包括Java对象对应的JavaScript原生对象属性。其中,JavaScript原生对象属性包括name、instId、_native_type_等。具体地,name用于指示JavaScript原生对象的名称,可由JavaScript层需要Java层返回的对象名称确定,例如,JavaScript层需要Java层返回的对象名称为websocket,则可确定JavaScript原生对象属性中的name为websocket。instId用于指示JavaScript原生对象的instance ID,可系统进行设置。__native_type__用于指示JavaScript原生对象的生成方式,__native_type__的属性包括instance、class等,如果__native_type__的属性为instance,说明JavaScript层接收到的JavaScript句柄对象的属性是对象,则JavaScript层可直接生成JavaScript原生对象;如果__native_type__的属性为class,则说明JavaScript层接收到的JavaScript句柄对象的属性是类,则JavaScript层需要先创建出类,再生成JavaScript原生对象。
其中,JavaScript原生对象属性结构如下:
基于JavaScript句柄对象包括的JavaScript原生对象属性,JavaScript层根据JavaScript句柄对象,生成JavaScript原生对象时,包括但不限于:
JavaScript层将JavaScript原生对象属性中的name作为JavaScript原生对象的名称;JavaScript层根据JavaScript原生对象属性中的instId,确定JavaScript原生对象的instance ID;JavaScript层根据JavaScript原生对象属性中的__native_type__,确定JavaScript原生对象的生成方式,进而通过对JavaScript句柄对象进行重包装,生成JavaScript原生对象。例如,JavaScript层将JavaScript句柄对象包装成websocket对象。
需要说明的是,由于JavaScript句柄对象是将Java对象转换得到的,而JavaScript原生对象是根据JavaScript句柄对象生成的,因而JavaScript原生对象与Java对象实际上通过JavaScript句柄对象即建立了绑定关系,且JavaScript层的JavaScript原生对象都对应一个Java对象提供服务。为了保证JavaScript原生对象与Java对象能够一一对应,当Java层通过同一JavaScript功能接口多次向JavaScript层返回JavaScript句柄对象时,Java实际上返回的是同一JavaScript句柄对象;当JavaScript层多次对同一JavaScript句柄对象进行包装时,JavaScript层实际上生成的是同一JavaScript原生对象。
在步骤S206中,在JavaScript原生对象的应用场景下,JavaScript层通过JavaScript功能接口向Java层发送调用消息。
当因业务需求,为了实现快应用中的某种功能,JavaScript层需要调用JavaScript原生对象的功能,或者JavaScript层需要将JavaScript原生对象作为其他JavaScript功能接口调用的参数时,JavaScript层可将该JavaScript原生对象对应的JavaScript接口对象作为调用参数,并通过JavaScript功能接口向Java层发送包括JavaScript接口对象的调用消息,以实现对相应Java对象的调用。在该过程中,由于JavaScript原生对象是JavaScript层根据Java层返回的JavaScript原生对象包装得到,因而在调用JavaScript原生对象的方法时,需要传入instId,并通过invoke机制完成,以说明在哪个JavaScript功能接口上执行调用。另外,为了减少数据传输量,JavaScript层向Java层发送的调用消息可以不包括JavaScript接口对象,而是包括JavaScript接口对象ID。
在步骤S207中,当接收到调用消息时,Java层获取JavaScript句柄对象对应的Java对象,以实现相应功能。
在本公开实施例中,对象接口管理器中存储有JavaScript句柄对象与Java对象之间的对应关系,当接收到调用消息时,Java层能够根据对象接口管理器中所存储的对应关系,获取JavaScript句柄对象对应的Java对象。由于每个JavaScript功能接口用于指示不同的功能,无法直接实现具体的功能,而Java层调用JavaScript功能接口在Java层创建的Java对象,用于具体实现这些功能。因此,当接收到调用消息,Java层采用Java对象,即可实现JavaScript功能接口所指示的功能。例如,如果JavaScript功能接口所指示的功能为建立长连接,则当接收到调用消息时,Java层采用相应的Java对象,以实现长连接功能。
对于上述数据交互过程,下面以JavaScript功能接口为websocket接口为例进行说明。
JavaScript调用websocketfactory.create接口在Java层创建一个Java端的websocket对象,Java层将websocket对象转换为JavaScript句柄对象,并将JavaScript句柄对象发送至JavaScript层,JavaScript层根据JavaScript句柄对象生成JavaScript端的websocket对象,该websocket对象为一个长连接通道,例如,在聊天场景下,两台设备通过websocket建立一个连接,在Java层就会有一个websocket对象做实现,JavaScript层调用websocket.send发送数据接口发送数据到Java层,Java层从对象接口管理器中获取其对应的websocket对象,并通过该websocket对象建立长连接。
在步骤S208中,当释放JavaScript原生对象占用的内存后,JavaScript层向Java层发送内存释放消息。
当检测到任一JavaScript原生对象满足内存释放条件时,JavaScript层采用JavaScript原生对象释放方法,释放JavaScript原生对象占用的内存,并向Java层发送内存释放消息,该内存释放消息包括所释放的JavaScript原生对象对应的JavaScript句柄对象。其中,内存释放条件包络创建时长到达预设时长,或者未被应用的时长达到预设时长等,该预设时长可由系统进行设置。
在步骤S209中,当接收到内存释放消息时,Java层基于重写的JavaScript句柄对象的释放方法,释放JavaScript句柄对象对应的Java对象占用的内存。
当接收到内存释放消息时,Java层基于重写的JavaScript句柄对象的释放方法,将JavaScript句柄对象从接口对象管理器中删除,当检测到JavaScript句柄对象从接口对象管理器中删除后,Java层释放JavaScript句柄对象对应的Java对象占用的内存。Java层释放JavaScript句柄对象对应的Java对象占用的内存时,可根据待释放内存的Java对象是否涉及到IO流,采用不同的方法进行回收。如果待释放内存的Java对象涉及到IO流,则Java层可采用close方法回收JavaScript句柄对象对应的Java对象占用的内存;如果待释放内存的Java对象未涉及到IO流,则Java层可采用方法release方法回收JavaScript句柄对象对应的Java对象占用的内存。
例如,JavaScript调用websocketfactory.create接口在Java层创建一个Java端的websocket对象,Java层将websocket对象转换为JavaScript句柄对象,重写JavaScript句柄对象的释放方法,并将JavaScript句柄对象发送至JavaScript层,JavaScript层根据JavaScript句柄对象,生成JavaScript端的websocket对象。当JavaScript层释放JavaScript端的websocket对象所占用的内存后,基于重写的JavaScript句柄对象的释放方法,Java层也将释放Java端的websocket对象所占用的内存。
本公开实施例提供的方法,Java层将Java对象转换为JavaScript句柄对象,并重写JavaScript句柄对象的释放方法,进而由JavaScript层根据JavaScript句柄对象生成与Java对象对应的JavaScript原生对象,当JavaScript层释放JavaScript原生对象占用的内存时,基于重写的释放方法,Java层也将释放Java对象占用的内存,从而避免Java层内存泄露,提升了系统性能。
图3是根据一示例性实施例示出的一种内存释放装置示意图。参照图3,该装置包括:对象创建模块301、对象转换模块302、对象生成模块303、发送模块304及内存释放模块305。
对象创建模块301被配置为调用JavaScript功能接口在Java层创建Java对象;
对象转换模块302被配置为将Java对象转换为JavaScript句柄对象,通过JavaScript功能接口将JavaScript句柄对象发送至JavaScript层,并重写JavaScript句柄对象的释放方法;
对象生成模块303被配置为根据JavaScript句柄对象,生成JavaScript原生对象;
发送模块304被配置为当释放JavaScript原生对象占用的内存后,向Java层发送内存释放消息,内存释放消息包括JavaScript句柄对象;
内存释放模块305被配置为当接收到内存释放消息时,基于重写的JavaScript句柄对象的释放方法,释放JavaScript句柄对象对应的Java对象占用的内存。
在本公开的另一个实施例中,对象创建模块301被配置为通过调用JavaScript功能接口的构造函数在Java层创建Java对象。
在本公开的另一个实施例中,对象创建模块301被配置为通过调用JavaScript功能接口的普通方法在Java层创建Java对象。
在本公开的另一个实施例中,对象转换模块302被配置为采用接口对象管理器将Java对象转换为JavaScript句柄对象,接口对象管理器用于将Java对象转换为JavaScript句柄对象。
在本公开的另一个实施中,该装置还包括:更改模块。
更改模块被配置为更改向JavaScript层返回值的Map,以使Java层能够通过JavaScript功能接口将JavaScript句柄对象发送至JavaScript层。
在本公开的另一个实施中,JavaScript句柄对象包括Java对象对应的JavaScript原生对象属性;
对象生成模块303被配置为根据JavaScript原生类型属性,生成JavaScript原生对象。
在本公开的另一个实施例中,内存释放模块305被配置为当接收到内存释放消息时,基于重写的JavaScript句柄对象的释放方法,将JavaScript句柄对象从接口对象管理器中删除,并释放JavaScript句柄对象对应的Java对象占用的内存。
在本公开的另一个实施例中,该装置还包括:发送模块304和获取模块;
发送模块304被配置为在JavaScript原生对象的应用场景下,通过JavaScript功能接口向Java层发送调用消息,调用消息包括JavaScript句柄对象;
获取模块被配置为当接收到调用消息时,获取JavaScript句柄对象对应的Java对象,以实现相应功能。
需要说明的是,本公开实施例中的对象创建模块301、对象生成模块303、发送模块304可设置于JavaScript层中,用于实现JavaScript层与Java层之间的数据交互,并释放JavaScript层中的JavaScript原生对象占用的内存;本公开实施中的对象转换模块302、内存释放模块305、更改模块及获取模块可设置于Java层,用于实现Java层与JavaScript层之间的数据交互,并释放Java对象占用的内存。
本公开实施例提供的装置,Java层将Java对象转换为JavaScript句柄对象,并重写JavaScript句柄对象的释放方法,进而由JavaScript层根据JavaScript句柄对象生成与Java对象对应的JavaScript原生对象,当JavaScript层释放JavaScript原生对象占用的内存时,基于重写的释放方法,Java层也将释放Java对象占用的内存,从而避免Java层内存泄露,提升了系统性能。
关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
图4是根据一示例性实施例示出的一种用于内存释放的装置400的框图。例如,装置400可以是移动电话,计算机,数字广播终端,消息收发设备,游戏控制台,平板设备,医疗设备,健身设备,个人数字助理等。
参照图4,装置400可以包括以下一个或多个组件:处理组件402,存储器404,电源组件406,多媒体组件408,音频组件410,输入/输出(I/O)接口412,传感器组件414,以及通信组件416。
处理组件402通常控制装置400的整体操作,诸如与显示,电话呼叫,数据通信,相机操作和记录操作相关联的操作。处理组件402可以包括一个或多个处理器420来执行指令,以完成上述的方法的全部或部分步骤。此外,处理组件402可以包括一个或多个模块,便于处理组件402和其他组件之间的交互。例如,处理组件402可以包括多媒体模块,以方便多媒体组件408和处理组件402之间的交互。
存储器404被配置为存储各种类型的数据以支持在装置400的操作。这些数据的示例包括用于在装置400上操作的任何应用程序或方法的指令,联系人数据,电话簿数据,消息,图片,视频等。存储器404可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。
电源组件406为装置400的各种组件提供电力。电源组件406可以包括电源管理系统,一个或多个电源,及其他与为装置400生成、管理和分配电力相关联的组件。
多媒体组件408包括在所述装置400和用户之间的提供一个输出接口的屏幕。在一些实施例中,屏幕可以包括液晶显示器(LCD)和触摸面板(TP)。如果屏幕包括触摸面板,屏幕可以被实现为触摸屏,以接收来自用户的输入信号。触摸面板包括一个或多个触摸传感器以感测触摸、滑动和触摸面板上的手势。所述触摸传感器可以不仅感测触摸或滑动动作的边界,而且还检测与所述触摸或滑动操作相关的持续时间和压力。在一些实施例中,多媒体组件408包括一个前置摄像头和/或后置摄像头。当装置400处于操作模式,如拍摄模式或视频模式时,前置摄像头和/或后置摄像头可以接收外部的多媒体数据。每个前置摄像头和后置摄像头可以是一个固定的光学透镜系统或具有焦距和光学变焦能力。
音频组件410被配置为输出和/或输入音频信号。例如,音频组件410包括一个麦克风(MIC),当装置400处于操作模式,如呼叫模式、记录模式和语音识别模式时,麦克风被配置为接收外部音频信号。所接收的音频信号可以被进一步存储在存储器404或经由通信组件416发送。在一些实施例中,音频组件410还包括一个扬声器,用于输出音频信号。
I/O接口412为处理组件402和外围接口模块之间提供接口,上述外围接口模块可以是键盘,点击轮,按钮等。这些按钮可包括但不限于:主页按钮、音量按钮、启动按钮和锁定按钮。
传感器组件414包括一个或多个传感器,用于为装置400提供各个方面的状态评估。例如,传感器组件414可以检测到装置400的打开/关闭状态,组件的相对定位,例如所述组件为装置400的显示器和小键盘,传感器组件414还可以检测装置400或装置400一个组件的位置改变,用户与装置400接触的存在或不存在,装置400方位或加速/减速和装置400的温度变化。传感器组件414可以包括接近传感器,被配置用来在没有任何的物理接触时检测附近物体的存在。传感器组件414还可以包括光传感器,如CMOS或CCD图像传感器,用于在成像应用中使用。在一些实施例中,该传感器组件414还可以包括加速度传感器,陀螺仪传感器,磁传感器,压力传感器或温度传感器。
通信组件416被配置为便于装置400和其他设备之间有线或无线方式的通信。装置400可以接入基于通信标准的无线网络,如WiFi,2G或3G,或它们的组合。在一个示例性实施例中,通信组件416经由广播信道接收来自外部广播管理系统的广播信号或广播相关信息。在一个示例性实施例中,所述通信组件416还包括近场通信(NFC)模块,以促进短程通信。例如,在NFC模块可基于射频识别(RFID)技术,红外数据协会(IrDA)技术,超宽带(UWB)技术,蓝牙(BT)技术和其他技术来实现。
在示例性实施例中,装置400可以被一个或多个应用专用集成电路(ASIC)、数字信号处理器(DSP)、数字信号处理设备(DSPD)、可编程逻辑器件(PLD)、现场可编程门阵列(FPGA)、控制器、微控制器、微处理器或其他电子元件实现,用于执行上述方法。
在示例性实施例中,还提供了一种包括指令的非临时性计算机可读存储介质,例如包括指令的存储器404,上述指令可由装置400的处理器420执行以完成上述方法。例如,所述非临时性计算机可读存储介质可以是ROM、随机存取存储器(RAM)、CD-ROM、磁带、软盘和光数据存储设备等。
一种非临时性计算机可读存储介质,当所述存储介质中的指令由移动终端的处理器执行时,使得移动终端能够执行一种内存释放方法。
本公开实施例提供的终端,Java层将Java对象转换为JavaScript句柄对象,并重写JavaScript句柄对象的释放方法,进而由JavaScript层根据JavaScript句柄对象生成与Java对象对应的JavaScript原生对象,当JavaScript层释放JavaScript原生对象占用的内存时,基于重写的释放方法,Java层也将释放Java对象占用的内存,从而避免Java层内存泄露,提升了系统性能。
本领域技术人员在考虑说明书及实践这里公开的公开后,将容易想到本公开的其它实施方案。本申请旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。
Claims (15)
1.一种内存释放方法,其特征在于,所述方法包括:
JavaScript层调用JavaScript功能接口在Java层创建Java对象;
所述Java层将所述Java对象转换为JavaScript句柄对象,更改向所述JavaScript层返回值的Map,通过所述JavaScript功能接口将所述JavaScript句柄对象发送至所述JavaScript层,并重写所述JavaScript句柄对象的释放方法;
所述JavaScript层根据所述JavaScript句柄对象,生成JavaScript原生对象;
当释放所述JavaScript原生对象占用的内存后,所述JavaScript层向所述Java层发送内存释放消息,所述内存释放消息包括所述JavaScript句柄对象;
当接收到所述内存释放消息时,所述Java层基于重写的所述JavaScript句柄对象的释放方法,释放所述JavaScript句柄对象对应的所述Java对象占用的内存。
2.根据权利要求1所述的方法,其特征在于,所述JavaScript层调用JavaScript功能接口在Java层创建Java对象,包括:
所述JavaScript层通过调用所述JavaScript功能接口的构造函数在所述Java层创建Java对象。
3.根据权利要求1所述的方法,其特征在于,所述JavaScript层调用JavaScript功能接口在Java层创建Java对象,包括:
所述JavaScript层通过调用所述JavaScript功能接口的普通方法在所述Java层创建Java对象。
4.根据权利要求1所述的方法,其特征在于,所述Java层将所述Java对象转换为JavaScript句柄对象,包括:
所述Java层采用接口对象管理器将所述Java对象转换为JavaScript句柄对象,所述接口对象管理器用于将Java对象转换为JavaScript句柄对象。
5.根据权利要求1所述的方法,其特征在于,所述JavaScript句柄对象包括所述Java对象对应的JavaScript原生对象属性,所述JavaScript层根据所述JavaScript句柄对象,生成JavaScript原生对象,包括:
所述JavaScript层根据所述JavaScript原生类型属性,生成JavaScript原生对象。
6.根据权利要求4所述的方法,其特征在于,所述当接收到所述内存释放消息时,所述Java层基于重写的所述JavaScript句柄对象的释放方法,释放所述JavaScript句柄对象对应的所述Java对象占用的内存,包括:
当接收到所述内存释放消息时,所述Java层基于重写的所述JavaScript句柄对象的释放方法,将所述JavaScript句柄对象从所述接口对象管理器中删除,并释放所述JavaScript句柄对象对应的所述Java对象占用的内存。
7.根据权利要求1所述的方法,其特征在于,所述JavaScript层根据所述JavaScript句柄对象,生成JavaScript原生对象之后,还包括:
在所述JavaScript原生对象的应用场景下,所述JavaScript层通过所述JavaScript功能接口向所述Java层发送调用消息,所述调用消息包括所述JavaScript句柄对象;
当接收到所述调用消息时,所述Java层获取所述JavaScript句柄对象对应的Java对象,以实现相应功能。
8.一种内存释放装置,其特征在于,所述装置包括:
对象创建模块,用于调用JavaScript功能接口在Java层创建Java对象;
对象转换模块,用于将所述Java对象转换为JavaScript句柄对象,更改向JavaScript层返回值的Map,通过所述JavaScript功能接口将所述JavaScript句柄对象发送至所述JavaScript层,并重写所述JavaScript句柄对象的释放方法;
对象生成模块,用于根据所述JavaScript句柄对象,生成JavaScript原生对象;
发送模块,用于当释放所述JavaScript原生对象占用的内存后,向所述Java层发送内存释放消息,所述内存释放消息包括所述JavaScript句柄对象;
内存释放模块,用于当接收到所述内存释放消息时,基于重写的所述JavaScript句柄对象的释放方法,释放所述JavaScript句柄对象对应的所述Java对象占用的内存。
9.根据权利要求8所述的装置,其特征在于,所述对象创建模块,用于通过调用所述JavaScript功能接口的构造函数在所述Java层创建Java对象。
10.根据权利要求8所述的装置,其特征在于,所述对象创建模块,用于通过调用所述JavaScript功能接口的普通方法在所述Java层创建Java对象。
11.根据权利要求8所述的装置,其特征在于,所述对象转换模块,用于采用接口对象管理器将所述Java对象转换为JavaScript句柄对象,所述接口对象管理器用于将Java对象转换为JavaScript句柄对象。
12.根据权利要求8所述的装置,其特征在于,所述JavaScript句柄对象包括所述Java对象对应的JavaScript原生对象属性;
所述对象生成模块,用于根据所述JavaScript原生类型属性,生成JavaScript原生对象。
13.根据权利要求11所述的装置,其特征在于,所述内存释放模块,用于当接收到所述内存释放消息时,基于重写的所述JavaScript句柄对象的释放方法,将所述JavaScript句柄对象从所述接口对象管理器中删除,并释放所述JavaScript句柄对象对应的所述Java对象占用的内存。
14.根据权利要求8所述的装置,其特征在于,所述装置还包括:
所述发送模块,用于在所述JavaScript原生对象的应用场景下,通过所述JavaScript功能接口向所述Java层发送调用消息,所述调用消息包括所述JavaScript句柄对象;
获取模块,用于当接收到所述调用消息时,获取所述JavaScript句柄对象对应的Java对象,以实现相应功能。
15.一种内存释放装置,其特征在于,包括:
处理器;
用于存储处理器可执行的指令的存储器;
其中,所述处理器被配置为:
JavaScript层调用JavaScript功能接口在Java层创建Java对象;
所述Java层将所述Java对象转换为JavaScript句柄对象,更改向所述JavaScript层返回值的Map,通过所述JavaScript功能接口将所述JavaScript句柄对象发送至所述JavaScript层,并重写所述JavaScript句柄对象的释放方法;
所述JavaScript层根据所述JavaScript句柄对象,生成JavaScript原生对象;
当释放所述JavaScript原生对象占用的内存后,所述JavaScript层向所述Java对象发送内存释放消息,所述内存释放消息包括所述JavaScript句柄对象;
当接收到所述内存释放消息时,所述Java层基于重写的所述JavaScript句柄对象的释放方法,释放所述JavaScript句柄对象对应的所述Java对象占用的内存。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810828812.3A CN108958943B (zh) | 2018-07-25 | 2018-07-25 | 内存释放方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810828812.3A CN108958943B (zh) | 2018-07-25 | 2018-07-25 | 内存释放方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108958943A CN108958943A (zh) | 2018-12-07 |
CN108958943B true CN108958943B (zh) | 2021-02-09 |
Family
ID=64463296
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810828812.3A Active CN108958943B (zh) | 2018-07-25 | 2018-07-25 | 内存释放方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108958943B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111240757B (zh) * | 2020-01-03 | 2024-02-06 | 北京小米移动软件有限公司 | 快应用控制方法、装置及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102053834A (zh) * | 2010-12-29 | 2011-05-11 | 北京握奇数据系统有限公司 | Java对象的存储方法及装置 |
KR20150089746A (ko) * | 2014-01-28 | 2015-08-05 | 한국전자통신연구원 | 자바스크립트의 메모리 관리 장치 및 그 방법 |
CN105808219A (zh) * | 2014-12-29 | 2016-07-27 | 中国移动通信集团公司 | 一种内存空间分配方法及装置 |
CN106843850A (zh) * | 2016-12-28 | 2017-06-13 | 北京五八信息技术有限公司 | 一种在React Native组件之间传递native对象的方法和装置 |
CN107430492A (zh) * | 2015-05-29 | 2017-12-01 | 谷歌公司 | 空闲时间软件垃圾收集 |
-
2018
- 2018-07-25 CN CN201810828812.3A patent/CN108958943B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102053834A (zh) * | 2010-12-29 | 2011-05-11 | 北京握奇数据系统有限公司 | Java对象的存储方法及装置 |
KR20150089746A (ko) * | 2014-01-28 | 2015-08-05 | 한국전자통신연구원 | 자바스크립트의 메모리 관리 장치 및 그 방법 |
CN105808219A (zh) * | 2014-12-29 | 2016-07-27 | 中国移动通信集团公司 | 一种内存空间分配方法及装置 |
CN107430492A (zh) * | 2015-05-29 | 2017-12-01 | 谷歌公司 | 空闲时间软件垃圾收集 |
CN106843850A (zh) * | 2016-12-28 | 2017-06-13 | 北京五八信息技术有限公司 | 一种在React Native组件之间传递native对象的方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN108958943A (zh) | 2018-12-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107862514B (zh) | 公交卡管理方法、装置及系统、存储介质 | |
CN109710259B (zh) | 一种数据处理方法、装置及存储介质 | |
CN109582400B (zh) | 程序调用方法及装置 | |
CN105808305B (zh) | 静态资源的加载方法和装置 | |
CN106547547B (zh) | 数据采集方法及装置 | |
CN105657805B (zh) | 一种智能设备接入无线网络的方法及装置 | |
CN110704030A (zh) | 接口配置信息生成方法、装置、电子设备及存储介质 | |
CN109117144B (zh) | 页面处理方法、装置、终端及存储介质 | |
CN107463372B (zh) | 一种数据驱动的页面更新方法和装置 | |
CN111222014A (zh) | 请求处理方法、装置、电子设备及存储介质 | |
CN111314419B (zh) | 网络请求方法及装置 | |
CN107423146B (zh) | 控制应用程序相互调用的方法、装置及系统 | |
CN105468606B (zh) | 网页保存的方法及装置 | |
CN108958943B (zh) | 内存释放方法及装置 | |
CN112328330A (zh) | iOS组件的调用方法、装置、中间件、电子设备及介质 | |
CN105376318A (zh) | 文件传输方法、装置及系统 | |
CN109032583B (zh) | 数据交互方法及装置 | |
CN109491655B (zh) | 一种输入事件处理方法及装置 | |
CN107885464B (zh) | 数据存储方法、装置及计算机可读存储介质 | |
CN107911807B (zh) | 蓝牙数据传输方法及装置 | |
CN114430410B (zh) | 基于虚拟域名的系统访问方法、装置及设备 | |
CN105607958B (zh) | 信息输入方法及装置 | |
CN112887799B (zh) | 影像资源分享方法、装置及介质 | |
CN116841625A (zh) | 基于安卓的usb网卡配置方法、装置、设备及存储介质 | |
CN109981729B (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 |