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

技术编号:10040258 阅读:294 留言:0更新日期:2014-05-14 10:51
本发明专利技术提供了一种Java虚拟机中类库的多线程预加载方法。首先连接类库,生成预加载列表,预加载列表中包含虚拟机运行时所需要预先加载的类;然后,根据线程个数,将预加载列表中的类平均分配到各个线程,同时启动各线程,将列表中的类加载到内存中,并对类中的静态变量进行初始化;最后,将预加载的类存入共享内存资源。本发明专利技术方法筛选记录了Java程序运行时需要多次加载或者必须常驻内存的类,使得预加载类库随着应用程序和用户使用习惯的改变而自动调整,有效提高Java程序的运行效率;同时,通过多线程同步加载预加载列表中的类,有效提高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虚拟机启动阶段类库本身的加载速度。<本文档来自技高网...

【技术保护点】
一种Java虚拟机中类库的多线程预加载方法,其特征在于,包括如下步骤:步骤1:连接类库,生成预加载列表;所述的预加载列表中包含虚拟机运行时所需要预先加载的类;当过程虚拟机初始化完成后,开始查询类库中的每个类,若类满足如下任一条件时,将类加入预加载列表,条件如下:(1)至少被两个应用所加载,(2)所需要加载的时间大于额定最小值,(3)常驻内存区域;步骤2:根据线程个数,将预加载列表中的类平均分配到各个线程,然后同时启动各个线程,将列表中的类加载到内存中,并对类中的静态变量进行初始化;步骤3:将预加载的类存入共享内存资源。

【技术特征摘要】
1.一种Java虚拟机中类库的多线程预加载方法,其特征在于,包括如下步骤:
步骤1:连接类库,生成预加载列表;所述的预加载列表中包含虚拟机运行时所需要预
先加载的类;当过程虚拟机初始化完成后,开始查询类库中的每个类,若类满足如下任一条
件时,将类加入预加载列表,条件如下:(1)至少被两个应用所加载,(2)所需要加载的时
间大于额定最小值,(3)常驻内存区域;
步骤2:根据线程个数,将预加载列表中的类平均分配到各个线程,然后同时启动各个
线程,将列...

【专利技术属性】
技术研发人员:赵胜男史晓华范礼阳杨海燕
申请(专利权)人:北京航空航天大学
类型:发明
国别省市:北京;11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1