CN103793249A - 一种Java虚拟机中类库的多线程预加载方法 - Google Patents

一种Java虚拟机中类库的多线程预加载方法 Download PDF

Info

Publication number
CN103793249A
CN103793249A CN201410035171.8A CN201410035171A CN103793249A CN 103793249 A CN103793249 A CN 103793249A CN 201410035171 A CN201410035171 A CN 201410035171A CN 103793249 A CN103793249 A CN 103793249A
Authority
CN
China
Prior art keywords
class
virtual machine
list
loaded
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.)
Pending
Application number
CN201410035171.8A
Other languages
English (en)
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.)
Beihang University
Original Assignee
Beihang University
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 Beihang University filed Critical Beihang University
Priority to CN201410035171.8A priority Critical patent/CN103793249A/zh
Publication of CN103793249A publication Critical patent/CN103793249A/zh
Pending legal-status Critical Current

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

本发明提供了一种Java虚拟机中类库的多线程预加载方法。首先连接类库,生成预加载列表,预加载列表中包含虚拟机运行时所需要预先加载的类;然后,根据线程个数,将预加载列表中的类平均分配到各个线程,同时启动各线程,将列表中的类加载到内存中,并对类中的静态变量进行初始化;最后,将预加载的类存入共享内存资源。本发明方法筛选记录了Java程序运行时需要多次加载或者必须常驻内存的类,使得预加载类库随着应用程序和用户使用习惯的改变而自动调整,有效提高Java程序的运行效率;同时,通过多线程同步加载预加载列表中的类,有效提高Java虚拟机启动阶段类库本身的加载速度。

Description

一种Java虚拟机中类库的多线程预加载方法
技术领域
本发明涉及Java虚拟机中的类加载技术,尤其是手机系统Java虚拟机中类的预加载方法。
背景技术
类加载器在虚拟机中主要负责对类文件的查询和加载。类加载器通过对二进制文件的解析来加载运行过程中该类的数据结构,然后对其进行调用,同时装载并连接该类中所有超类和超类之间的接口。当虚拟机需要装载一个类时,类加载器就会查找该类所对应的字节码文件,然后对这个字节码文件进行加载,提取其中所需的数据信息存储到内存中。
运行在手机上的Java虚拟机,例如Android系统下的Dalvik虚拟机在设备开机时就进行预加载,预先将所有基础类加载到内存中,以此来提高Java程序的执行效率。
但类加载器所预先加载的基础类资源量很大,很可能会导致设备开机时预加载类的过程时间过长。
发明内容
本发明针对目前类加载器预加载的基础资源量大,开机过程长的问题,提出了一种Java虚拟机中类库的多线程预加载方法。本发明方法以多线程并发的方式来完成虚拟机预加载过程,尤其是针对在手机中使用的多核处理器,采用了多运算引擎并行运行的方式来提高系统中整体的使用效率和程序的运行速度。
本发明提供的一种Java虚拟机中类库的多线程预加载方法,包括如下步骤:
第一步,连接类库,生成预加载列表,所述的预加载列表中包含虚拟机运行时所需要预先加载的类;
第二步,根据线程个数,将预加载列表中的类平均分配到各个线程,然后同时启动各个线程,将列表中的类加载到内存中,并对类中的静态变量进行初始化;
第三步,将预加载的类存入共享内存资源。
所述的第一步中,当过程虚拟机初始化完成后开始查询类库中的每个类,若类满足如下任一条件时,将类加入预加载列表,条件如下:(1)至少被两个应用所加载;(2)所需要加载的时间大于额定最小值;(3)常驻内存区域。
所述的第二步中,各个线程的工作过程为:首先获取一个输入流,用于读取预加载列表中类的信息;然后创建类相应的存贮对象,设置缓存额度和读取对象;对预加载列表中当前行包含的注释和空行忽略掉;最后调用Java虚拟机中的接口将类的信息加载到内存中,并对类中的静态变量进行初始化。
本发明的优点与积极效果在于:通过预加载列表的方式筛选记录Java程序运行时需要多次加载或者必须常驻内存的类,从而预测出下次运行时需要预加载的类表,可以使得预加载类库随着应用程序和用户使用习惯的改变而自动调整,从而有效提高Java程序的运行效率。同时,通过多线程加载的方式同步加载预加载列表中的类,可以有效提高Java虚拟机启动阶段类库本身的加载速度。
附图说明
图1是本发明的Java虚拟机中类库的多线程加载方法的原理示意图;
图2是本发明中预加载列表的生成方法示意图;
图3是本发明中多线程同步预加载类的过程示意图。
具体实施方式
下面将结合附图和实施例对本发明作进一步的详细说明。
本发明工作原理如图1所示。虚拟机的运行过程将按照图1中所给出的流程来执行,其预加载列表的生成方法则按照图2所示的流程进行。在获得分配好了的预加载类的列表后,可以采用图3中给出的方法进行加载。在图1虚线部分,以及图2和3中所提出来的方法和执行机制均为本发明独创。
图1中给出了Java虚拟机中类库的多线程加载的主要过程。虚线范围内的部分为优化过程。当硬件已启动完成后,本发明的Java虚拟机中类库的多线程预加载方法的过程如下:
第一步,连接类库,生成预加载列表。把虚拟机运行时所需要预先加载的类都列在同一个文件里,形成一个预加载列表,在加载过程中虚拟机先访问预加载列表中的预加载项,然后对预加载项逐一进行加载。
第二步,进行多线程类加载。通过平均分配的方法对预加载列表进行线程分配,以并发的形式对虚拟机中的资源进行同步预加载,初始化静态变量。
第三步,将预加载的类信息存入共享内存资源。
当Java程序运行时,不必重新加载,从共享内存资源中直接抽取所需的类,并执行包含在已装载的类或接口中的指令,经Jit编译器实时编译或Java解释器编译,获取字节码指令,然后分析并执行即可。本发明实施例中图1中的硬件可以是手机,操作系统为Android系统。
如图2所示为预加载列表的生成过程,包括步骤1.1~步骤1.5。
其中“开始”表示过程虚拟机已初始化完成。
步骤1.1:连接类库,获取类信息,依次读取每个类开始执行步骤1.2。
步骤1.2:判断所读取的类是否被至少两个应用所加载,如果是,将该类加入预加载列表,然后转步骤1.5执行;如果否,则进入下一步判断。
步骤1.3:判断所读取的类所需要加载的时间是否大于额定最小值,如果是,将该类加入预加载列表,然后转步骤1.5执行;如果否,则进入下一步判断。
步骤1.4:判断所读取的类是否常驻内存区域,也就是该类存储的是否为运行环境必须的类信息,如果是,将该类加入预加载列表,然后执行步骤1.5;如果否,则直接执行步骤1.5。
步骤1.5:判断是否类库中所有的类都完成了查询,如果是,则完成预加载列表的生成;如果否,继续读取下一个类,然后转步骤1.2执行。
通过如图2所示的预加载列表的方式,筛选记录Java程序运行时需要多次加载或者必须常驻内存的类,从而预测出下次运行时需要预加载的类表,可以使得预加载类库随着应用程序和用户使用习惯的改变而自动调整,从而有效提高Java程序的运行效率。
如图3所示为第二步中类库的多线程加载方法,包括步骤2.1~步骤2.7。
步骤2.1:获取预加载列表信息。
步骤2.2:根据多线程计算引擎的个数,将预加载列表中的类进行平均分配,形成多个子预加载列表。每个子预加载列表中包含的预加载类的个数基本相同。
步骤2.3:启动多线程,进行类的预加载,每一个线程获得一个子预加载列表地址。
步骤2.4:各个线程中,首先获取一个输入流,以便读取虚拟机的预加载列表中记录的类。
步骤2.5:在获取输入流的基础上,创建类相应的存贮对象,设置缓存(Buffer)额度、读取(Reader)对象等,例如创建BufferedReader对象,并读取预加载列表中的内容。
步骤2.6:判断输入的预加载列表中当前行是否包含注释或是空行,如果否,进行下一步;否则,如果包含注释,则忽略所读内容中的注释,然后执行步骤2.7,如果是空行,则继续读取下一行进行判断。
步骤2.7:调用Java虚拟机中相应的接口,例如Class.forName()接口,将列表中的类的信息加载到内存中,对类中的静态变量进行初始化。
通过多线程加载的方式同步加载预加载列表中的类,可以有效提高Java虚拟机启动阶段类库本身的加载速度。

Claims (2)

1.一种Java虚拟机中类库的多线程预加载方法,其特征在于,包括如下步骤:
步骤1:连接类库,生成预加载列表;所述的预加载列表中包含虚拟机运行时所需要预先加载的类;当过程虚拟机初始化完成后,开始查询类库中的每个类,若类满足如下任一条件时,将类加入预加载列表,条件如下:(1)至少被两个应用所加载,(2)所需要加载的时间大于额定最小值,(3)常驻内存区域;
步骤2:根据线程个数,将预加载列表中的类平均分配到各个线程,然后同时启动各个线程,将列表中的类加载到内存中,并对类中的静态变量进行初始化;
步骤3:将预加载的类存入共享内存资源。
2.根据权利要求1所述的Java虚拟机中类库的多线程预加载方法,其特征在于,步骤2中所述的各个线程的工作过程为:首先获取一个输入流,用于读取预加载列表中类的信息;然后创建类相应的存贮对象,设置缓存额度和读取对象;对预加载列表中当前行包含的注释和空行忽略掉;最后调用Java虚拟机中的接口将类的信息加载到内存中,并对类中的静态变量进行初始化。
CN201410035171.8A 2014-01-24 2014-01-24 一种Java虚拟机中类库的多线程预加载方法 Pending CN103793249A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201410035171.8A CN103793249A (zh) 2014-01-24 2014-01-24 一种Java虚拟机中类库的多线程预加载方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201410035171.8A CN103793249A (zh) 2014-01-24 2014-01-24 一种Java虚拟机中类库的多线程预加载方法

Publications (1)

Publication Number Publication Date
CN103793249A true CN103793249A (zh) 2014-05-14

Family

ID=50668964

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410035171.8A Pending CN103793249A (zh) 2014-01-24 2014-01-24 一种Java虚拟机中类库的多线程预加载方法

Country Status (1)

Country Link
CN (1) CN103793249A (zh)

Cited By (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105511874A (zh) * 2015-12-02 2016-04-20 海信集团有限公司 嵌入式系统启动方法和智能终端
CN105549958A (zh) * 2015-12-02 2016-05-04 海信集团有限公司 嵌入式系统启动方法和智能终端
CN105955765A (zh) * 2016-04-22 2016-09-21 北京小米移动软件有限公司 应用预加载方法及装置
CN107122214A (zh) * 2017-04-28 2017-09-01 广东欧珀移动通信有限公司 应用程序的预处理方法、装置及终端
CN108717374A (zh) * 2018-04-24 2018-10-30 阿里巴巴集团控股有限公司 Java虚拟机启动时预热的方法、装置、及计算机设备
CN109254834A (zh) * 2017-07-13 2019-01-22 普天信息技术有限公司 一种多线程启动同步方法
CN112612530A (zh) * 2019-09-18 2021-04-06 华为技术有限公司 类查询方法及装置
CN112905255A (zh) * 2019-11-19 2021-06-04 阿里巴巴集团控股有限公司 信息处理方法、装置及电子设备
CN112947927A (zh) * 2019-11-22 2021-06-11 华为技术有限公司 应用程序运行方法、装置、终端设备及介质
CN113656089A (zh) * 2020-04-30 2021-11-16 华为技术有限公司 应用程序中的类验证方法和装置
CN114266058A (zh) * 2021-12-24 2022-04-01 北京人大金仓信息技术股份有限公司 针对加密数据的解密预加载方法及装置

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
GAURAV SINGH: "Optimizing the Boot Time of Android on Embedded System", 《2011 IEEE 15TH INTERNATIONAL SYMPOSIUM ON CONSUMER ELECTRONICS》 *
王金海,江务学: "基于Java多线程的并发机制的研究和实现", 《微机发展》 *
禹建磊: "Android系统启动程序的优化设计与实现", 《中国优秀硕士学位论文全文数据库信息科技辑 》 *

Cited By (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105549958A (zh) * 2015-12-02 2016-05-04 海信集团有限公司 嵌入式系统启动方法和智能终端
CN105511874A (zh) * 2015-12-02 2016-04-20 海信集团有限公司 嵌入式系统启动方法和智能终端
CN105955765A (zh) * 2016-04-22 2016-09-21 北京小米移动软件有限公司 应用预加载方法及装置
CN105955765B (zh) * 2016-04-22 2020-03-03 北京小米移动软件有限公司 应用预加载方法及装置
CN107122214A (zh) * 2017-04-28 2017-09-01 广东欧珀移动通信有限公司 应用程序的预处理方法、装置及终端
CN109254834B (zh) * 2017-07-13 2021-05-14 普天信息技术有限公司 一种多线程启动同步方法
CN109254834A (zh) * 2017-07-13 2019-01-22 普天信息技术有限公司 一种多线程启动同步方法
CN108717374A (zh) * 2018-04-24 2018-10-30 阿里巴巴集团控股有限公司 Java虚拟机启动时预热的方法、装置、及计算机设备
CN108717374B (zh) * 2018-04-24 2021-08-17 创新先进技术有限公司 Java虚拟机启动时预热的方法、装置、及计算机设备
CN112612530A (zh) * 2019-09-18 2021-04-06 华为技术有限公司 类查询方法及装置
CN112612530B (zh) * 2019-09-18 2022-05-17 华为技术有限公司 类查询方法及装置
CN112905255A (zh) * 2019-11-19 2021-06-04 阿里巴巴集团控股有限公司 信息处理方法、装置及电子设备
CN112947927A (zh) * 2019-11-22 2021-06-11 华为技术有限公司 应用程序运行方法、装置、终端设备及介质
CN113656089A (zh) * 2020-04-30 2021-11-16 华为技术有限公司 应用程序中的类验证方法和装置
CN113656089B (zh) * 2020-04-30 2023-02-28 华为技术有限公司 应用程序中的类验证方法和装置
CN114266058A (zh) * 2021-12-24 2022-04-01 北京人大金仓信息技术股份有限公司 针对加密数据的解密预加载方法及装置

Similar Documents

Publication Publication Date Title
CN103793249A (zh) 一种Java虚拟机中类库的多线程预加载方法
CN102799456B (zh) 一种游戏引擎加载资源文件的方法、装置和计算机
US8561040B2 (en) One-pass compilation of virtual instructions
US8650538B2 (en) Meta garbage collection for functional code
US11354159B2 (en) Method, a device, and a computer program product for determining a resource required for executing a code segment
US10175965B2 (en) Multiphased profile guided optimization
US8522222B2 (en) Tracing just-in-time compilation with pointers to local variables
US9710355B2 (en) Selective loading of code elements for code analysis
US8056061B2 (en) Data processing device and method using predesignated register
CN105302717A (zh) 一种大数据平台的检测方法及装置
CN103309800A (zh) 一种网页自动化测试方法和系统
CN103154891B (zh) 虚拟机阶段检测
Ma et al. A stack-on-demand execution model for elastic computing
US20130159689A1 (en) Method and apparatus for initializing embedded device
CN111783018A (zh) 一种页面处理方法、装置及设备
CN112487092A (zh) 一种基于区块链的智能合约调用方法及装置
CN100549958C (zh) 一种类文件装载方法和系统
US7698534B2 (en) Reordering application code to improve processing performance
CN114691496A (zh) 单元测试方法、装置、计算设备及介质
US9836401B2 (en) Multi-core simulation system and method based on shared translation block cache
CN105630526A (zh) 脚本的加载控制方法及装置
CN105446718B (zh) 基于红帽软件包管理器的软件管理方法及系统
KR101593583B1 (ko) 어플리케이션 실행 장치 및 방법
CN113867712A (zh) 游戏代码生成方法、装置、计算机设备和存储介质
CN110888771A (zh) 对进程进行监视分析的方法、装置、电子设备及存储介质

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
RJ01 Rejection of invention patent application after publication

Application publication date: 20140514

RJ01 Rejection of invention patent application after publication