CN102681866B - 一种运行Java程序的方法和装置 - Google Patents

一种运行Java程序的方法和装置 Download PDF

Info

Publication number
CN102681866B
CN102681866B CN201110374578.XA CN201110374578A CN102681866B CN 102681866 B CN102681866 B CN 102681866B CN 201110374578 A CN201110374578 A CN 201110374578A CN 102681866 B CN102681866 B CN 102681866B
Authority
CN
China
Prior art keywords
java
frame
stack
described java
java stack
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
Application number
CN201110374578.XA
Other languages
English (en)
Other versions
CN102681866A (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.)
Feitian Technologies Co Ltd
Original Assignee
Feitian Technologies 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 Feitian Technologies Co Ltd filed Critical Feitian Technologies Co Ltd
Priority to CN201110374578.XA priority Critical patent/CN102681866B/zh
Publication of CN102681866A publication Critical patent/CN102681866A/zh
Application granted granted Critical
Publication of CN102681866B publication Critical patent/CN102681866B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Stored Programmes (AREA)

Abstract

本发明实施例公开一种运行Java程序的方法和装置,该方法包括:Java虚拟机判断RAM中的Java栈是否满足第一预设条件,如果Java栈不满足第一预设条件,则继续运行Java程序;如果Java栈满足第一预设条件,则Java虚拟机将Java栈中的一个或多个帧复制到非易失性存储器中,将Java栈顶指针向Java栈底部方向移动,并继续运行Java程序。Java虚拟机判断Java栈是否满足第二预设条件,如果Java栈不满足第二预设条件,则继续运行Java程序;如果Java栈满足第二预设条件,则Java虚拟机将非易失性存储器中的一个或多个帧复制到Java栈中,将Java栈顶指针向Java栈顶部方向移动。本发明实施例使用非易失性存储器作为Java栈的扩展存储空间,可以避免由于资源不足而导致的异常情况的发生。

Description

一种运行Java程序的方法和装置
技术领域
本发明涉及计算机技术领域,特别是涉及一种运行Java程序的方法和装置。
背景技术
Java虚拟机是一种用于计算设备的规范,可以通过在实际的计算机上仿真模拟各种计算机功能来实现的。在Java应用开发过程中,开发人员使用IDE(Integrated Development Environment,集成开发环境)编写Java源代码文件(.java),并调用Java的编译器将Java源代码编译成与平台无关的字节码,Java虚拟机加载并执行上述字节码。
Java卡虚拟机是Java虚拟机的子集合,用于对Java卡Applet进行程序编译、执行以及结果返回。同Java虚拟机一样,Java卡虚拟机的运算模式也是基于栈的结构的,通过将局部变量入栈进行运算,在运算结束后,将运算结果出栈并写回局部变量。具体地,Java卡虚拟机运行时,会开设用于存储数据的Java栈,Java栈中存储的数据以帧为单位。在调用一个新的方法时,Java卡虚拟机会向Java栈中压入一个新帧。上述正在执行的方法称为当前方法,当前方法使用的帧称为当前帧,当前帧用于记录当前方法的运行状态。Java卡虚拟机在当前帧内调用当前方法对应的Java字节码,在当前方法执行结束后,将当前帧弹出并抛弃。由上述运算模式可知,Java卡虚拟机对栈的大小要求较高。现有的实现中,通常将Java栈放在RAM(Random Access Memory,随机存储器)中。
发明人在实现本发明的过程中,发现现有技术至少存在以下缺陷:
现有的嵌入式芯片的RAM通常只有几K至十几K的存储空间,且其中的大部分空间还要用于存储C的全局变量和栈,以及用作通信的缓存和虚拟机的堆空间,因此,留给Java栈的空间通常都会比较少,会限制Java方法的调用层次和递归调用的深度。如果Java方法的调用层次过深,RAM将无法提供足够的空间执行Java方法。当Java卡虚拟机无法向RAM中的Java栈压入新帧时,Java卡应用程序将无法正常运行,JCRE(Java Card Runtime Environment,Java卡运行环境)会抛出资源不足的异常。
发明内容
本发明实施例提供了一种运行Java程序的方法和装置,以解决RAM中的Java栈的空间不足的缺陷。
本发明实施例提供了一种运行Java程序的方法,包括:
①、Java虚拟机判断随机存储器RAM中的Java栈是否满足第一预设条件,如果所述Java栈不满足所述第一预设条件,则继续运行Java程序;如果所述Java栈满足所述第一预设条件,则执行步骤②;
②、所述Java虚拟机将所述Java栈中的所有帧复制到非易失性存储器中,将Java栈顶指针移动到Java栈底部,并继续运行Java程序;
或者,
所述Java虚拟机从位于所述Java栈底部的帧开始,选取一个帧或多个连续存储的帧,将选取的帧复制到所述非易失性存储器中,并判断所述Java栈中是否存在未被选取的帧,如果存在一个未被选取的帧,则将所述未被选取的帧复制到所述Java栈中的包括所述Java栈底部在内的存储空间,将所述Java栈顶指针移动到所述Java栈中与所述未被选取的帧被复制到的存储空间相邻且比所述存储空间更接近所述Java栈顶部的位置;如果存在多个未被选取的帧,则按照各个未被选取的帧之间的排列顺序,将所有未被选取的帧复制到所述Java栈中的包括所述Java栈底部在内的连续存储空间,将所述Java栈顶指针移动到与所述所有未被选取的帧中最接近Java栈顶部的帧被复制到的位置相邻且比所述被复制到的位置更接近所述Java栈顶部的位置,并继续运行所述Java程序;如果不存在未被选取的帧,则将所述Java栈顶指针移动到所述Java栈底部,并继续运行所述Java程序;
③、当所述Java程序中的Java方法运行结束时,所述Java虚拟机将所述Java栈中与所述Java方法对应的帧从所述Java栈中弹出,判断所述Java栈是否满足第二预设条件,如果所述Java栈满足所述第二预设条件,则执行步骤④;如果所述Java栈不满足所述第二预设条件,则继续运行所述Java程序;
④、当所述Java栈中没有帧时,所述Java虚拟机将所述非易失性存储器中的一个或多个帧复制到所述Java栈中,将所述Java栈顶指针移动到与被复制到所述Java栈中的帧中最接近所述Java栈顶部的帧的位置相邻且比所述最接近所述Java栈顶部的帧的位置更接近所述Java栈顶部的位置,并继续运行所述Java程序;
当所述Java栈中有帧时,所述Java虚拟机确定需要从所述非易失性存储器复制到所述Java栈中的帧的大小以及所述Java栈中对应的预留存储空间,将所述Java栈中的帧复制到所述Java栈中与所述预留存储空间相邻且比所述预留存储空间更接近所述Java栈顶部的连续存储空间,将确定的帧复制到所述预留存储空间,将所述Java栈顶指针移动到与所述连续存储空间顶部的帧的位置相邻且比所述顶部的帧的位置更接近所述Java栈顶部的位置,并继续运行所述Java程序。
本发明实施例还提供了一种运行Java程序的装置,包括第一判断模块、第二判断模块、处理模块和运行模块,其中,
所述第一判断模块,用于判断随机存储器RAM中的Java栈是否满足第一预设条件;
所述第二判断模块,用于所述处理模块将所述Java栈中的帧从所述Java栈中弹出后,判断所述Java栈是否满足第二预设条件;
所述处理模块,用于在所述Java栈满足所述第一预设条件时,将所述Java栈中的所有帧复制到非易失性存储器中,将Java栈顶指针移动到Java栈底部,并触发所述运行模块继续运行Java程序;或者,从位于所述Java栈底部的帧开始,选取一个帧或多个连续存储的帧,将选取的帧复制到所述非易失性存储器中,并判断所述Java栈中是否存在未被选取的帧,如果存在一个未被选取的帧,则将所述未被选取的帧复制到所述Java栈中的包括所述Java栈底部在内的连续存储空间,将所述Java栈顶指针移动到所述Java栈中与所述未被选取的帧被复制到的存储空间相邻且比所述存储空间更接近所述Java栈顶部的位置;如果存在多个未被选取的帧,则按照各个未被选取的帧之间的排列顺序,将所有未被选取的帧复制到所述Java栈中的包括所述Java栈底部在内的连续存储空间,将所述Java栈顶指针移动到与所述所有未被选取的帧中最接近Java栈顶部的帧被复制到的位置相邻且比所述被复制到的位置更接近所述Java栈顶部的位置,并继续运行所述Java程序;如果不存在未被选取的帧,则将所述Java栈顶指针移动到所述Java栈底部,并触发所述运行模块继续运行所述Java程序;
在所述Java程序中的Java方法运行结束时,将所述Java栈中与所述Java方法对应的帧从所述Java栈中弹出;
在所述Java栈满足所述第二预设条件,且所述Java栈中没有帧时,将所述非易失性存储器中的一个或多个帧复制到所述Java栈中,将所述Java栈顶指针移动到与被复制到所述Java栈中的帧中最接近所述Java栈顶部的帧的位置相邻且比所述最接近所述Java栈顶部的帧的位置更接近所述Java栈顶部的位置,并触发所述运行模块继续运行所述Java程序;
在所述Java栈满足所述第二预设条件,且所述Java栈中有帧时,确定需要从所述非易失性存储器复制到所述Java栈中的帧的大小以及所述Java栈中对应的预留存储空间,将所述Java栈中的帧复制到所述Java栈中与所述预留存储空间相邻且比所述预留存储空间更接近所述Java栈顶部的连续存储空间,将确定的帧复制到所述预留存储空间,将所述Java栈顶指针移动到与所述连续存储空间顶部的帧的位置相邻且比所述顶部的帧的位置更接近所述Java栈顶部的位置,并触发所述运行模块继续运行所述Java程序;
所述运行模块,用于在所述第一判断模块判断所述Java栈不满足所述第一预设条件时,继续运行Java程序;在所述第二判断模块判断所述Java栈不满足所述第二预设条件时,继续运行所述Java程序。
本发明实施例在RAM中的Java栈的空间不足时,使用非易失性存储器作为Java栈的扩展存储空间,可以有效地扩展Java栈的尺寸,提升虚拟机的灵活性,避免由于资源不足而导致的异常情况的发生。
附图说明
图1为本发明实施例一提供的一种运行Java程序的方法流程图;
图2为本发明实施例二提供的一种运行Java程序的方法流程图;
图3为本发明实施例三提供的一种运行Java程序的方法流程图;
图4为本发明实施例四提供的一种运行Java程序的装置结构图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例一
本发明实施例一提供了一种运行Java程序的方法,如图1所示,包括以下步骤:
步骤101,Java虚拟机调用Java方法时,计算执行所述Java方法所需的空间大小。
具体地,Java虚拟机可以计算Java方法对应的帧的大小,帧包括局部变量区、操作数栈和帧数据区,其中,局部变量区和操作数栈的大小由编译器和转换器生成,可以在调用Java方法时获知;帧数据区的大小与实现相关,通常是固定的。Java虚拟机可以对局部变量区、操作数栈和帧数据区的大小进行求和,得到帧的大小。由于Java虚拟机是在Java方法对应的帧内执行该Java方法,因此,Java方法对应的帧的大小即为执行所述Java方法所需的空间大小。
步骤102,Java虚拟机判断RAM中是否有足够的空间执行所述Java方法,如果有,则执行步骤105;否则,执行步骤103。
具体地,Java虚拟机运行时,会在RAM中划分出一块数据区域存储Java栈,Java栈可以由多个帧组成,每个帧均对应Java虚拟机中的一个Java方法调用。随着Java虚拟机中Java方法调用层次的加深,Java栈中的帧的数量也相应地增多,Java栈在RAM中占用的空间也会相应地增大。当Java虚拟机调用新的Java方法时,如果RAM中用于存储Java栈的数据区域的剩余空间小于新调用的Java方法对应的帧的大小时,则RAM中没有足够的空间执行该Java方法。
步骤103,Java虚拟机将RAM中位于Java栈底部的部分帧复制到非易失性存储器中。
具体地,可以预先在非易失性存储器中指定一定大小的区域作为Java栈的扩展存储空间,Java虚拟机可以将RAM中位于Java栈底部的部分帧复制到非易失性存储器中的指定区域。
其中,被复制到非易失性存储器中的帧可以是包括位于Java栈底部的帧在内的连续存储的多个帧,被复制到非易失性存储器中的帧的数量可以被预先设定,也可以被动态修改。非易失性存储器可以为EEPROM(Electrically ErasableProgrammable Read-Only Memory,电可擦可编程只读存储器),也可以为Flash(闪存)。
步骤104,Java虚拟机将RAM中未被复制到非易失性存储器的帧复制到Java栈中的比该帧的当前位置更接近Java栈底部的存储空间,并根据复制后的帧的位置将Java栈顶指针向栈底方向移动。
具体地,Java虚拟机可以将RAM中未被复制到非易失性存储器的帧复制到Java栈中的包括Java栈底部在内的连续存储空间,也可以复制到Java栈中的其他存储空间,只要保证对于同一帧而言,其复制后的位置比复制前的位置更接近Java栈底部即可。
相应地,Java虚拟机还可以根据复制后的帧的位置将Java栈顶指针向栈底方向移动,移动前的Java栈顶指针指向与最接近Java栈顶部的帧的位置相邻且比该帧的位置更接近Java栈顶部的位置,移动后的Java栈顶指针指向与上述帧被复制到的位置相邻且比上述帧被复制到的位置更接近Java栈顶部的位置。
步骤105,Java虚拟机执行所述Java方法。
具体地,Java虚拟机向RAM中的Java栈中压入一个新帧,并在该帧内执行所述Java方法。
需要说明的是,在本发明的其他实施方式中,Java虚拟机也可以在向RAM中的Java栈中压入一个新帧后,判断RAM中用于存储Java栈的数据区域的剩余空间是否小于第一预设值,如果小于第一预设值,则将RAM中位于Java栈底部的部分帧复制到非易失性存储器中,将RAM中未被复制到非易失性存储器的帧复制到Java栈中的比该帧的当前位置更接近Java栈底部的存储空间,并根据复制后的帧的位置将Java栈顶指针向栈底方向移动。上述实施方式同样可以实现本发明的发明目的。
Java虚拟机还可以在向RAM中的Java栈中压入一个新帧后,判断Java栈中的帧的数量是否大于第二预设值,如果大于第二预设值,则将RAM中位于Java栈底部的部分帧复制到非易失性存储器中,将RAM中未被复制到非易失性存储器的帧复制到Java栈中比该帧的当前位置更接近Java栈底部的存储空间,并根据复制后的帧的位置将Java栈顶指针向栈底方向移动。上述实施方式同样可以实现本发明的发明目的。
本发明实施例在RAM中的Java栈的空间不足时,使用非易失性存储器作为Java栈的扩展存储空间,可以有效地扩展Java栈的尺寸,提升虚拟机的灵活性,避免由于资源不足而导致的异常情况的发生。
实施例二
在上述实施例一中,由于将位于RAM中的Java栈中的帧转移到非易失性存储器中,当Java程序的调用层次减少时,如果RAM中的Java栈中已经没有被调用的Java方法对应的帧,Java虚拟机可以将非易失性存储器中的部分或全部帧恢复到RAM中的Java栈。
本发明实施例二提供了一种运行Java程序的方法,如图2所示,包括以下步骤:
步骤201,当Java方法运行结束时,Java虚拟机将该Java方法对应的帧从Java栈中弹出并抛弃。
步骤202,Java虚拟机判断RAM中的Java栈中是否存在帧,如果是,则执行步骤204;否则,执行步骤203。
步骤203,Java虚拟机将非易失性存储器中的帧复制到RAM中的Java栈中,并根据复制后的帧的位置将Java栈顶指针向栈顶方向移动。
具体地,当RAM中的Java栈中没有帧时,Java虚拟机可以将非易失性存储器中的部分或者全部帧复制到RAM中的Java栈的任意位置,优选地,可以将非易失性存储器中的部分或者全部帧复制到Java栈中包括Java栈底部在内的连续存储空间。
相应地,Java虚拟机还可以根据复制后的帧的位置将Java栈顶指针向栈顶方向移动,移动后的Java栈顶指针指向与最接近Java栈顶部的帧的位置相邻且比该帧的位置更接近Java栈顶部的位置。
步骤204,Java虚拟机继续执行调用的Java方法。
本发明实施例在RAM中的Java栈中没有帧时,将非易失性存储器中的帧复制到RAM中的Java栈中,通过使用非易失性存储器作为Java栈的扩展存储空间,可以有效地扩展Java栈的尺寸,提升虚拟机的灵活性,避免由于资源不足而导致的异常情况的发生。
实施例三
在上述实施例一中,由于将位于RAM中的Java栈中的帧转移到非易失性存储器中,当Java程序的调用层次减少时,如果RAM中的Java栈中的帧的数量小于第四预设值(该第四预设值可以为大于1的整数)时,Java虚拟机可以将非易失性存储器中的部分或全部帧恢复到RAM中的Java栈。
本发明实施例三提供了一种运行Java程序的方法,如图3所示,包括以下步骤:
步骤301,当Java方法运行结束时,Java虚拟机将该Java方法对应的帧从Java栈中弹出并抛弃。
步骤302,Java虚拟机判断RAM中的Java栈中是否存在帧,如果是,则执行步骤304;否则,执行步骤303。
步骤303,Java虚拟机将非易失性存储器中的帧复制到RAM中的Java栈中,根据复制后的帧的位置将Java栈顶指针向栈顶方向移动。
具体地,当RAM中的Java栈中没有帧时,Java虚拟机可以将非易失性存储器中的部分或者全部帧复制到RAM中的Java栈的任意位置,优选地,可以将非易失性存储器中的部分或者全部帧复制到Java栈中的包括底部在内的连续存储空间。
相应地,Java虚拟机还可以根据复制后的帧的位置将Java栈顶指针向栈顶方向移动,移动后的Java栈顶指针指向与Java栈中最接近Java栈顶部的帧的位置相邻且比该帧的位置更接近Java栈顶部的位置。
需要说明的是,在执行完本步骤后,继续执行步骤308。
步骤304,Java虚拟机判断RAM中的Java栈中的帧的数量是否小于第四预设值,如果是,则执行步骤305;否则,执行步骤308。
其中,第四预设值可以为大于1的整数值,可以为固定值,也可以被动态修改。
步骤305,Java虚拟机确定需要从非易失性存储器复制到RAM中的帧,并根据需要从非易失性存储器复制到RAM中的帧的大小,在Java栈中确定与上述确定的帧对应的预留存储空间。
其中,预留存储空间可以为Java栈中的包括Java栈底部在内的连续存储空间,预留存储空间的大小可以为需要从非易失性存储器复制到RAM中的帧的大小。
步骤306,Java虚拟机将RAM中的Java栈中的帧复制到Java栈中与预留存储空间相邻且比预留存储空间更接近Java栈顶部的连续存储空间,并根据复制后的帧的位置将Java栈顶指针向栈顶方向移动。
其中,移动前的Java栈顶指针指向与最接近Java栈顶部的帧的位置相邻且比该帧的位置更接近Java栈顶部的位置,移动后的Java栈顶指针指向与上述帧被复制到的位置相邻且比上述帧被复制到的位置更接近Java栈顶部的位置。
步骤307,Java虚拟机将非易失性存储器中的帧复制到RAM中的预留存储空间。
步骤308,Java继续执行调用的Java方法。
需要说明的是,步骤308也可以在步骤307之前执行,还可以与步骤307同时执行。
另外,在本发明的其他实施方式中,Java虚拟机也可以先将RAM中的Java栈中的帧复制到Java栈中比该帧的当前位置更接近Java栈顶部的存储空间,进而将与该存储空间相邻且比该存储空间更接近Java栈底部的连续存储空间作为预留存储空间,再将非易失性存储器中的帧复制到该预留存储空间,同样可以实现本发明的发明目的。
此外,在本发明的其他实施方式中,Java虚拟机还可以判断RAM中用于存储Java栈的数据区域的剩余空间是否大于第三预设值,如果大于第三预设值,则将RAM中的Java栈中的帧复制到Java栈中比该帧的当前位置更接近Java栈顶部的存储空间,进而将与该存储空间相邻且比该存储空间更接近Java栈底部的连续存储空间作为预留存储空间,再将非易失性存储器中的帧复制到该预留存储空间,同样可以实现本发明的发明目的。
本发明实施例在RAM中的Java栈的空间充足时,将非易失性存储器中的帧复制到RAM中的Java栈中,通过使用非易失性存储器作为Java栈的扩展存储空间,可以有效地扩展Java栈的尺寸,提升虚拟机的灵活性,避免由于资源不足而导致的异常情况的发生。
本发明实施例中,Java虚拟机在将RAM中的Java栈中的帧复制到非易失性存储器时,可以将Java栈中的所有帧复制到非易失性存储器中,以减少对非易失性存储器进行写操作的次数;也可以将Java栈中最接近栈底的一个帧复制到非易失性存储器中,尽可能避免将非易失性存储器中的帧复制到RAM中的Java栈中,从而减少对非易失性存储器进行读操作的次数。
相应地,在将非易失性存储器中的帧复制到RAM中的Java栈中时,Java虚拟机可以根据非易失性存储器中的各个帧被复制到非易失性存储器之前在Java栈中的位置,将位置最接近栈顶的一个帧复制到Java栈中,尽可能避免由于RAM中的Java栈空间不足而导致再次将RAM中的Java栈中的帧复制到非易失性存储器,从而进一步减少对非易失性存储器进行写操作的次数;此外,在RAM中的Java栈空间充足的情况下,Java虚拟机也可以将非易失性存储器中的所有帧复制到Java栈中,从而进一步减少对非易失性存储器进行读操作的次数。
本发明的其他实施例中,基于平衡对非易失性存储器进行读操作的和写操作的次数的考虑,Java虚拟机在将RAM中的Java栈中的帧复制到非易失性存储器时,可以从位于Java栈底部的帧开始,连续选取多个帧,当选取的帧的数据总量最接近Java栈的空间大小的二分之一时,将选取的帧复制到非易失性存储器中;
相应地,在将非易失性存储器中的帧复制到RAM中的Java栈中时,Java虚拟机可以根据非易失性存储器中的各个帧被复制到非易失性存储器之前在Java栈中的位置,从位置最接近栈顶的一个帧开始,连续选取多个帧,当选取的帧的数据总量最接近Java栈的空间大小的二分之一时,将选取的帧复制到Java栈中。本发明上述实施例能够平衡对非易失性存储器进行读操作的和写操作的次数,避免对非易失性存储器频繁地进行读操作和写操作。
实施例四
本发明实施例四提供了一种运行Java程序的装置,如图4所示,包括第一判断模块410、第二判断模块420、处理模块430和运行模块440,其中,
所述第一判断模块410,用于判断随机存储器RAM中的Java栈是否满足第一预设条件。
具体地,所述第一判断模块410,具体用于:
当调用所述Java程序中的Java方法时,判断所述Java栈中的可写入空间的大小是否小于与被调用的Java方法对应的帧的大小,如果小于,则判断满足所述第一预设条件;否则,则判断不满足所述第一预设条件;
或者,
当向所述Java栈压入一个帧后,判断所述Java栈中的可写入空间的大小是否小于第一预设值,如果小于,则判断满足所述第一预设条件;否则,则判断不满足所述第一预设条件;
或者,
当向所述Java栈压入一个帧后,判断所述Java栈中的帧的数量是否大于第二预设值,如果大于,则判断满足所述第一预设条件;否则,则判断不满足所述第一预设条件。
所述第二判断模块420,用于所述处理模块430将所述Java栈中的帧从所述Java栈中弹出后,判断所述Java栈是否满足第二预设条件。
所述第二判断模块420,具体用于:
判断所述Java栈中的可写入空间的大小是否大于第三预设值,如果大于,则判断满足所述第二预设条件;否则,则判断不满足所述第二预设条件;
或者,
判断所述Java栈中的帧的数量是否小于第四预设值,如果小于,则判断满足所述第二预设条件;否则,则判断不满足所述第二预设条件。
所述处理模块430,用于在所述Java栈满足所述第一预设条件时,将所述Java栈中的所有帧复制到非易失性存储器中,将Java栈顶指针移动到Java栈底部,并触发所述运行模块440继续运行Java程序;或者,从位于所述Java栈底部的帧开始,选取一个帧或多个连续存储的帧,将选取的帧复制到所述非易失性存储器中,并判断所述Java栈中是否存在未被选取的帧,如果存在一个未被选取的帧,则将所述未被选取的帧复制到所述Java栈中的包括所述Java栈底部在内的存储空间,将所述Java栈顶指针移动到所述Java栈中与所述未被选取的帧被复制到的存储空间相邻且比所述存储空间更接近所述Java栈顶部的位置;如果存在多个未被选取的帧,则按照各个未被选取的帧之间的排列顺序,将所有未被选取的帧复制到所述Java栈中的包括所述Java栈底部在内的连续存储空间,将所述Java栈顶指针移动到与所述所有未被选取的帧中最接近Java栈顶部的帧被复制到的位置相邻且比所述被复制到的位置更接近所述Java栈顶部的位置,并触发所述运行模块440继续运行Java程序;如果不存在未被选取的帧,则将所述Java栈顶指针移动到所述Java栈底部,并触发所述运行模块440继续运行所述Java程序;
在所述Java程序中的Java方法运行结束时,将所述Java栈中与所述Java方法对应的帧从所述Java栈中弹出;
在所述Java栈满足所述第二预设条件,且所述Java栈中没有帧时,将所述非易失性存储器中的一个或多个帧复制到所述Java栈中,将所述Java栈顶指针移动到与被复制到所述Java栈中的帧中最接近所述Java栈顶部的帧的位置相邻且比所述最接近所述Java栈顶部的帧的位置更接近所述Java栈顶部的位置,并触发所述运行模块440继续运行所述Java程序;
在所述Java栈满足所述第二预设条件,且所述Java栈中有帧时,确定需要从所述非易失性存储器复制到所述Java栈中的帧的大小以及所述Java栈中对应的预留存储空间,将所述Java栈中的帧复制到所述Java栈中与所述预留存储空间相邻且比所述预留存储空间更接近所述Java栈顶部的连续存储空间,将确定的帧复制到所述预留存储空间,将所述Java栈顶指针移动到与所述连续存储空间顶部的帧的位置相邻且比所述顶部的帧的位置更接近所述Java栈顶部的位置,并触发所述运行模块440继续运行所述Java程序。
所述处理模块430,可以在所述Java栈满足所述第二预设条件时,
将所述非易失性存储器中的所有帧复制到所述Java栈中;
或者,
根据所述非易失性存储器中的各个帧被复制到所述非易失性存储器之前在所述Java栈中的位置,从位置最接近栈顶的帧开始,选取一个帧或多个连续存储的帧,将选取的帧复制到所述Java栈中。
所述处理模块430,还可以在所述Java栈满足所述第一预设条件时,从位于所述Java栈底部的帧开始,选取一个帧或多个连续存储的帧,当选取的帧的数据总量最接近所述Java栈的空间大小的二分之一时,将选取的帧复制到非易失性存储器中;在所述Java栈满足所述第二预设条件时,根据所述非易失性存储器中的各个帧被复制到所述非易失性存储器之前在所述Java栈中的位置,从位置最接近栈顶的帧开始,选取一个帧或多个连续存储的帧,当选取的帧的数据总量最接近所述Java栈的空间大小的二分之一时,将选取的帧复制到所述Java栈中。
所述运行模块440,用于在所述第一判断模块410判断所述Java栈不满足所述第一预设条件时,继续运行Java程序;在所述第二判断模块420判断所述Java栈不满足所述第二预设条件时,继续运行所述Java程序。
本发明实施例在RAM中的Java栈的空间不足时,使用非易失性存储器作为Java栈的扩展存储空间,可以有效地扩展Java栈的尺寸,提升虚拟机的灵活性,避免由于资源不足而导致的异常情况的发生。
本发明实施例不仅可以应用于Java虚拟机中,也可以应用于Java卡虚拟机以及其他类型的虚拟机中,在此不再一一赘述。
结合本文中所公开的实施例描述的方法可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。

Claims (6)

1.一种运行Java程序的方法,其特征在于,包括:
①、Java虚拟机判断随机存储器RAM中的Java栈是否满足第一预设条件,如果所述Java栈不满足所述第一预设条件,则继续运行Java程序;如果所述Java栈满足所述第一预设条件,则执行步骤②;
②、所述Java虚拟机将所述Java栈中的所有帧复制到非易失性存储器中,将Java栈顶指针移动到Java栈底部,并继续运行Java程序;
或者,
所述Java虚拟机从位于所述Java栈底部的帧开始,选取一个帧或多个连续存储的帧,将选取的帧复制到所述非易失性存储器中,并判断所述Java栈中是否存在未被选取的帧,如果存在一个未被选取的帧,则将所述未被选取的帧复制到所述Java栈中的包括所述Java栈底部在内的存储空间,将所述Java栈顶指针移动到所述Java栈中与所述未被选取的帧被复制到的存储空间相邻且比所述存储空间更接近所述Java栈顶部的位置;如果存在多个未被选取的帧,则按照各个未被选取的帧之间的排列顺序,将所有未被选取的帧复制到所述Java栈中的包括所述Java栈底部在内的连续存储空间,将所述Java栈顶指针移动到与所述所有未被选取的帧中最接近Java栈顶部的帧被复制到的位置相邻且比所述被复制到的位置更接近所述Java栈顶部的位置,并继续运行所述Java程序;如果不存在未被选取的帧,则将所述Java栈顶指针移动到所述Java栈底部,并继续运行所述Java程序;
③、当所述Java程序中的Java方法运行结束时,所述Java虚拟机将所述Java栈中与所述Java方法对应的帧从所述Java栈中弹出,判断所述Java栈是否满足第二预设条件,如果所述Java栈满足所述第二预设条件,则执行步骤④;如果所述Java栈不满足所述第二预设条件,则继续运行所述Java程序;
④、当所述Java栈中没有帧时,所述Java虚拟机将所述非易失性存储器中的一个或多个帧复制到所述Java栈中,将所述Java栈顶指针移动到与被复制到所述Java栈中的帧中最接近所述Java栈顶部的帧的位置相邻且比所述最接近所述Java栈顶部的帧的位置更接近所述Java栈顶部的位置,并继续运行所述Java程序;
当所述Java栈中有帧时,所述Java虚拟机确定需要从所述非易失性存储器复制到所述Java栈中的帧的大小以及所述Java栈中对应的预留存储空间,将所述Java栈中的帧复制到所述Java栈中与所述预留存储空间相邻且比所述预留存储空间更接近所述Java栈顶部的连续存储空间,将确定的帧复制到所述预留存储空间,将所述Java栈顶指针移动到与所述连续存储空间顶部的帧的位置相邻且比所述顶部的帧的位置更接近所述Java栈顶部的位置,并继续运行所述Java程序;
其中,所述Java虚拟机判断RAM中的Java栈是否满足第一预设条件,具体为:
当调用所述Java程序中的Java方法时,所述Java虚拟机判断所述Java栈中的可写入空间的大小是否小于与被调用的Java方法对应的帧的大小,如果小于,则满足所述第一预设条件;否则,则不满足所述第一预设条件;
或者,
当向所述Java栈压入一个帧后,所述Java虚拟机判断所述Java栈中的可写入空间的大小是否小于第一预设值,如果小于,则满足所述第一预设条件;否则,则不满足所述第一预设条件;
或者,
当向所述Java栈压入一个帧后,所述Java虚拟机判断所述Java栈中的帧的数量是否大于第二预设值,如果大于,则满足所述第一预设条件;否则,则不满足所述第一预设条件;
所述Java虚拟机判断所述Java栈是否满足第二预设条件,具体为:
所述Java虚拟机判断所述Java栈中的可写入空间的大小是否大于第三预设值,如果大于,则满足所述第二预设条件;否则,则不满足所述第二预设条件;
或者,
所述Java虚拟机判断所述Java栈中的帧的数量是否小于第四预设值,如果小于,则满足所述第二预设条件;否则,则不满足所述第二预设条件。
2.如权利要求1所述的方法,其特征在于,所述Java虚拟机将所述非易失性存储器中的一个或多个帧复制到所述Java栈中,包括:
所述Java虚拟机将所述非易失性存储器中的所有帧复制到所述Java栈中;
或者,
所述Java虚拟机根据所述非易失性存储器中的各个帧被复制到所述非易失性存储器之前在所述Java栈中的位置,从位置最接近栈顶的帧开始,选取一个帧或多个连续存储的帧,将选取的帧复制到所述Java栈中。
3.如权利要求1所述的方法,其特征在于,所述Java虚拟机从位于所述Java栈底部的帧开始,选取一个帧或多个连续存储的帧,将选取的帧复制到所述非易失性存储器中,具体为:
所述Java虚拟机从位于所述Java栈底部的帧开始,选取一个帧或多个连续存储的帧,当选取的帧的数据总量最接近所述Java栈的空间大小的二分之一时,将选取的帧复制到非易失性存储器中;
所述Java虚拟机将所述非易失性存储器中的一个或多个帧复制到所述Java栈中,具体为:
所述Java虚拟机根据所述非易失性存储器中的各个帧被复制到所述非易失性存储器之前在所述Java栈中的位置,从位置最接近栈顶的帧开始,选取一个帧或多个连续存储的帧,当选取的帧的数据总量最接近所述Java栈的空间大小的二分之一时,将选取的帧复制到所述Java栈中。
4.一种运行Java程序的装置,其特征在于,包括第一判断模块、第二判断模块、处理模块和运行模块,其中,
所述第一判断模块,用于判断随机存储器RAM中的Java栈是否满足第一预设条件;
所述第二判断模块,用于所述处理模块将所述Java栈中的帧从所述Java栈中弹出后,判断所述Java栈是否满足第二预设条件;
所述处理模块,用于在所述Java栈满足所述第一预设条件时,将所述Java栈中的所有帧复制到非易失性存储器中,将Java栈顶指针移动到Java栈底部,并触发所述运行模块继续运行Java程序;或者,从位于所述Java栈底部的帧开始,选取一个帧或多个连续存储的帧,将选取的帧复制到所述非易失性存储器中,并判断所述Java栈中是否存在未被选取的帧,如果存在一个未被选取的帧,则将所述未被选取的帧复制到所述Java栈中的包括所述Java栈底部在内的存储空间,将所述Java栈顶指针移动到所述Java栈中与所述未被选取的帧被复制到的存储空间相邻且比所述存储空间更接近所述Java栈顶部的位置;如果存在多个未被选取的帧,则按照各个未被选取的帧之间的排列顺序,将所有未被选取的帧复制到所述Java栈中的包括所述Java栈底部在内的连续存储空间,将所述Java栈顶指针移动到与所述所有未被选取的帧中最接近Java栈顶部的帧被复制到的位置相邻且比所述被复制到的位置更接近所述Java栈顶部的位置,并继续运行所述Java程序;如果不存在未被选取的帧,则将所述Java栈顶指针移动到所述Java栈底部,并触发所述运行模块继续运行所述Java程序;
在所述Java程序中的Java方法运行结束时,将所述Java栈中与所述Java方法对应的帧从所述Java栈中弹出;
在所述Java栈满足所述第二预设条件,且所述Java栈中没有帧时,将所述非易失性存储器中的一个或多个帧复制到所述Java栈中,将所述Java栈顶指针移动到与被复制到所述Java栈中的帧中最接近所述Java栈顶部的帧的位置相邻且比所述最接近所述Java栈顶部的帧的位置更接近所述Java栈顶部的位置,并触发所述运行模块继续运行所述Java程序;
在所述Java栈满足所述第二预设条件,且所述Java栈中有帧时,确定需要从所述非易失性存储器复制到所述Java栈中的帧的大小以及所述Java栈中对应的预留存储空间,将所述Java栈中的帧复制到所述Java栈中与所述预留存储空间相邻且比所述预留存储空间更接近所述Java栈顶部的连续存储空间,将确定的帧复制到所述预留存储空间,将所述Java栈顶指针移动到与所述连续存储空间顶部的帧的位置相邻且比所述顶部的帧的位置更接近所述Java栈顶部的位置,并触发所述运行模块继续运行所述Java程序;
所述运行模块,用于在所述第一判断模块判断所述Java栈不满足所述第一预设条件时,继续运行Java程序;在所述第二判断模块判断所述Java栈不满足所述第二预设条件时,继续运行所述Java程序;
其中,所述第一判断模块,具体用于:
当调用所述Java程序中的Java方法时,判断所述Java栈中的可写入空间的大小是否小于与被调用的Java方法对应的帧的大小,如果小于,则判断满足所述第一预设条件;否则,则判断不满足所述第一预设条件;
或者,
当向所述Java栈压入一个帧后,判断所述Java栈中的可写入空间的大小是否小于第一预设值,如果小于,则判断满足所述第一预设条件;否则,则判断不满足所述第一预设条件;
或者,
当向所述Java栈压入一个帧后,判断所述Java栈中的帧的数量是否大于第二预设值,如果大于,则判断满足所述第一预设条件;否则,则判断不满足所述第一预设条件;
所述第二判断模块,具体用于:
判断所述Java栈中的可写入空间的大小是否大于第三预设值,如果大于,则判断满足所述第二预设条件;否则,则判断不满足所述第二预设条件;
或者,
判断所述Java栈中的帧的数量是否小于第四预设值,如果小于,则判断满足所述第二预设条件;否则,则判断不满足所述第二预设条件。
5.如权利要求4所述的装置,其特征在于,
所述处理模块,具体用于在所述Java栈满足所述第二预设条件,且所述Java栈中没有帧时,
将所述非易失性存储器中的所有帧复制到所述Java栈中;
或者,
根据所述非易失性存储器中的各个帧被复制到所述非易失性存储器之前在所述Java栈中的位置,从位置最接近栈顶的帧开始,选取一个帧或多个连续存储的帧,将选取的帧复制到所述Java栈中。
6.如权利要求4所述的装置,其特征在于,
所述处理模块,具体用于在所述Java栈满足所述第一预设条件时,从位于所述Java栈底部的帧开始,选取一个帧或多个连续存储的帧,当选取的帧的数据总量最接近所述Java栈的空间大小的二分之一时,将选取的帧复制到非易失性存储器中;在所述Java栈满足所述第二预设条件,且所述Java栈中没有帧时,根据所述非易失性存储器中的各个帧被复制到所述非易失性存储器之前在所述Java栈中的位置,从位置最接近栈顶的帧开始,选取一个帧或多个连续存储的帧,当选取的帧的数据总量最接近所述Java栈的空间大小的二分之一时,将选取的帧复制到所述Java栈中。
CN201110374578.XA 2011-11-22 2011-11-22 一种运行Java程序的方法和装置 Active CN102681866B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201110374578.XA CN102681866B (zh) 2011-11-22 2011-11-22 一种运行Java程序的方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201110374578.XA CN102681866B (zh) 2011-11-22 2011-11-22 一种运行Java程序的方法和装置

Publications (2)

Publication Number Publication Date
CN102681866A CN102681866A (zh) 2012-09-19
CN102681866B true CN102681866B (zh) 2015-07-22

Family

ID=46813842

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201110374578.XA Active CN102681866B (zh) 2011-11-22 2011-11-22 一种运行Java程序的方法和装置

Country Status (1)

Country Link
CN (1) CN102681866B (zh)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103106097B (zh) * 2013-03-12 2016-02-10 无锡江南计算技术研究所 一种即时编译系统中的栈运算优化方法
CN103942100A (zh) * 2014-05-09 2014-07-23 内蒙古中大传媒发展有限公司 一种基于中间件架构下java栈的多线程实现方法
CN104536810B (zh) * 2014-12-18 2018-05-11 北京奇虎科技有限公司 一种基于栈的异常检测方法和装置
CN104978154A (zh) * 2015-07-27 2015-10-14 武汉天喻信息产业股份有限公司 一种基于缓存操作的flash快速读写方法及系统
CN106844103B (zh) * 2017-01-16 2019-05-21 山东大学 非易失处理器备份容量设定、内存备份方法及系统
CN107193629A (zh) * 2017-04-07 2017-09-22 上海交通大学 基于非易失性内存与Java虚拟机的新型数据管理方法
CN111443991B (zh) * 2020-03-26 2023-06-23 恒宝股份有限公司 智能卡控制方法、装置及智能卡

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6131144A (en) * 1997-04-01 2000-10-10 Sun Microsystems, Inc. Stack caching method with overflow/underflow control using pointers
CN1963762A (zh) * 2005-11-08 2007-05-16 联发科技股份有限公司 堆栈管理系统及方法
CN101034374A (zh) * 2006-03-10 2007-09-12 三星电子株式会社 在虚拟机中管理栈的设备和方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6131144A (en) * 1997-04-01 2000-10-10 Sun Microsystems, Inc. Stack caching method with overflow/underflow control using pointers
CN1963762A (zh) * 2005-11-08 2007-05-16 联发科技股份有限公司 堆栈管理系统及方法
CN101034374A (zh) * 2006-03-10 2007-09-12 三星电子株式会社 在虚拟机中管理栈的设备和方法

Also Published As

Publication number Publication date
CN102681866A (zh) 2012-09-19

Similar Documents

Publication Publication Date Title
CN102681866B (zh) 一种运行Java程序的方法和装置
US7107579B2 (en) Preserving program context when adding probe routine calls for program instrumentation
US7424705B2 (en) Dynamic management of compiled code
US7406684B2 (en) Compiler, dynamic compiler, and replay compiler
US9280350B2 (en) Methods and apparatus to perform adaptive pre-fetch operations in managed runtime environments
US20110154299A1 (en) Apparatus and method for executing instrumentation code
KR101665219B1 (ko) 네스티드 에뮬레이션 및 동적 링킹 환경
US10261918B2 (en) Process running method and apparatus
US20130125096A1 (en) Systems and Methods for Dynamic Collection of Probe Call Sites
US20060101437A1 (en) Data processing device and method
CN106055481B (zh) 计算机程序的测试方法及装置
US9389843B2 (en) Efficient interpreter profiling to obtain accurate call-path information
CN103218241B (zh) 补丁加载方法和装置
US6625806B1 (en) Language processing method and language processing system improving use efficiency of cache memory
KR100818919B1 (ko) 메소드 호출 방법 및 이를 이용한 자바 가상 머신
US20140025870A1 (en) Computer reprogramming method, data storage medium and motor vehicle computer
US20060265687A1 (en) Method for Finding a Function Call Stack in Run Time for a Computer System
Higuera-Toledano et al. Analyzing the performance of memory management in RTSJ
CN111190658A (zh) 一种基于片内执行且在不具有MMU的SoC片上支持应用程序动态加载的系统
CN106469102B (zh) Java虚拟机中的软件再生方法及装置
KR100928865B1 (ko) 컴퓨터 시스템에서의 스택 확장 및 보호 방법과 그 장치
KR100884926B1 (ko) 가상 메모리가 없는 임베디드 시스템에서의 기존 공유라이브러리 사용방법
Kim et al. Efficient reuse of local regions in memory-limited mobile devices
Kell The inevitable death of VMs: a progress report
CN105607912A (zh) 一种Java对象分配优化方法、装置及设备

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant