CN102681866A - 一种运行Java程序的方法和装置 - Google Patents
一种运行Java程序的方法和装置 Download PDFInfo
- Publication number
- CN102681866A CN102681866A CN201110374578XA CN201110374578A CN102681866A CN 102681866 A CN102681866 A CN 102681866A CN 201110374578X A CN201110374578X A CN 201110374578XA CN 201110374578 A CN201110374578 A CN 201110374578A CN 102681866 A CN102681866 A CN 102681866A
- Authority
- CN
- China
- Prior art keywords
- java
- stack
- frame
- java stack
- preset condition
- 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.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 70
- 230000002159 abnormal effect Effects 0.000 abstract description 6
- 230000007812 deficiency Effects 0.000 abstract 1
- 230000007423 decrease Effects 0.000 description 2
- 230000007547 defect Effects 0.000 description 2
- 238000006467 substitution reaction Methods 0.000 description 2
- 238000004891 communication Methods 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 230000006870 function Effects 0.000 description 1
Images
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应用开发过程中,开发人员使用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 (10)
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程序。
2.如权利要求1所述的方法,其特征在于,所述Java虚拟机判断RAM中的Java栈是否满足第一预设条件,具体为:
当调用所述Java程序中的Java方法时,所述Java虚拟机判断所述Java栈中的可写入空间的大小是否小于与被调用的Java方法对应的帧的大小,如果小于,则满足所述第一预设条件;否则,则不满足所述第一预设条件;
或者,
当向所述Java栈压入一个帧后,所述Java虚拟机判断所述Java栈中的可写入空间的大小是否小于第一预设值,如果小于,则满足所述第一预设条件;否则,则不满足所述第一预设条件;
或者,
当向所述Java栈压入一个帧后,所述Java虚拟机判断所述Java栈中的帧的数量是否大于第二预设值,如果大于,则满足所述第一预设条件;否则,则不满足所述第一预设条件。
3.如权利要求1所述的方法,其特征在于,所述Java虚拟机判断所述Java栈是否满足第二预设条件,具体为:
所述Java虚拟机判断所述Java栈中的可写入空间的大小是否大于第三预设值,如果大于,则满足所述第二预设条件;否则,则不满足所述第二预设条件;
或者,
所述Java虚拟机判断所述Java栈中的帧的数量是否小于第四预设值,如果小于,则满足所述第二预设条件;否则,则不满足所述第二预设条件。
4.如权利要求1所述的方法,其特征在于,所述Java虚拟机将所述非易失性存储器中的一个或多个帧复制到所述Java栈中,包括:
所述Java虚拟机将所述非易失性存储器中的所有帧复制到所述Java栈中;
或者,
所述Java虚拟机根据所述非易失性存储器中的各个帧被复制到所述非易失性存储器之前在所述Java栈中的位置,从位置最接近栈顶的帧开始,选取一个帧或多个连续存储的帧,将选取的帧复制到所述Java栈中。
5.如权利要求1所述的方法,其特征在于,所述Java虚拟机从位于所述Java栈底部的帧开始,选取一个帧或多个连续存储的帧,将选取的帧复制到所述非易失性存储器中,具体为:
所述Java虚拟机从位于所述Java栈底部的帧开始,选取一个帧或多个连续存储的帧,当选取的帧的数据总量最接近所述Java栈的空间大小的二分之一时,将选取的帧复制到非易失性存储器中;
所述Java虚拟机将所述非易失性存储器中的一个或多个帧复制到所述Java栈中,具体为:
所述Java虚拟机根据所述非易失性存储器中的各个帧被复制到所述非易失性存储器之前在所述Java栈中的位置,从位置最接近栈顶的帧开始,选取一个帧或多个连续存储的帧,当选取的帧的数据总量最接近所述Java栈的空间大小的二分之一时,将选取的帧复制到所述Java栈中。
6.一种运行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程序。
7.如权利要求6所述的装置,其特征在于,所述第一判断模块,具体用于:
当调用所述Java程序中的Java方法时,判断所述Java栈中的可写入空间的大小是否小于与被调用的Java方法对应的帧的大小,如果小于,则判断满足所述第一预设条件;否则,则判断不满足所述第一预设条件;
或者,
当向所述Java栈压入一个帧后,判断所述Java栈中的可写入空间的大小是否小于第一预设值,如果小于,则判断满足所述第一预设条件;否则,则判断不满足所述第一预设条件;
或者,
当向所述Java栈压入一个帧后,判断所述Java栈中的帧的数量是否大于第二预设值,如果大于,则判断满足所述第一预设条件;否则,则判断不满足所述第一预设条件。
8.如权利要求6所述的装置,其特征在于,
所述第二判断模块,具体用于:
判断所述Java栈中的可写入空间的大小是否大于第三预设值,如果大于,则判断满足所述第二预设条件;否则,则判断不满足所述第二预设条件;
或者,
判断所述Java栈中的帧的数量是否小于第四预设值,如果小于,则判断满足所述第二预设条件;否则,则判断不满足所述第二预设条件。
9.如权利要求6所述的装置,其特征在于,
所述处理模块,具体用于在所述Java栈满足所述第二预设条件时,
将所述非易失性存储器中的所有帧复制到所述Java栈中;
或者,
根据所述非易失性存储器中的各个帧被复制到所述非易失性存储器之前在所述Java栈中的位置,从位置最接近栈顶的帧开始,选取一个帧或多个连续存储的帧,将选取的帧复制到所述Java栈中。
10.如权利要求6所述的装置,其特征在于,
所述处理模块,具体用于在所述Java栈满足所述第一预设条件时,从位于所述Java栈底部的帧开始,选取一个帧或多个连续存储的帧,当选取的帧的数据总量最接近所述Java栈的空间大小的二分之一时,将选取的帧复制到非易失性存储器中;在所述Java栈满足所述第二预设条件时,根据所述非易失性存储器中的各个帧被复制到所述非易失性存储器之前在所述Java栈中的位置,从位置最接近栈顶的帧开始,选取一个帧或多个连续存储的帧,当选取的帧的数据总量最接近所述Java栈的空间大小的二分之一时,将选取的帧复制到所述Java栈中。
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 true CN102681866A (zh) | 2012-09-19 |
CN102681866B 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) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103106097A (zh) * | 2013-03-12 | 2013-05-15 | 无锡江南计算技术研究所 | 一种即时编译系统中的栈运算优化方法 |
CN103942100A (zh) * | 2014-05-09 | 2014-07-23 | 内蒙古中大传媒发展有限公司 | 一种基于中间件架构下java栈的多线程实现方法 |
CN104536810A (zh) * | 2014-12-18 | 2015-04-22 | 北京奇虎科技有限公司 | 一种基于栈的异常检测方法和装置 |
CN104978154A (zh) * | 2015-07-27 | 2015-10-14 | 武汉天喻信息产业股份有限公司 | 一种基于缓存操作的flash快速读写方法及系统 |
CN106844103A (zh) * | 2017-01-16 | 2017-06-13 | 山东大学 | 非易失处理器备份容量设定、内存备份方法及系统 |
CN107193629A (zh) * | 2017-04-07 | 2017-09-22 | 上海交通大学 | 基于非易失性内存与Java虚拟机的新型数据管理方法 |
CN111443991A (zh) * | 2020-03-26 | 2020-07-24 | 恒宝股份有限公司 | 智能卡控制方法、装置及智能卡 |
Citations (3)
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 | 三星电子株式会社 | 在虚拟机中管理栈的设备和方法 |
-
2011
- 2011-11-22 CN CN201110374578.XA patent/CN102681866B/zh active Active
Patent Citations (3)
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 | 三星电子株式会社 | 在虚拟机中管理栈的设备和方法 |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103106097A (zh) * | 2013-03-12 | 2013-05-15 | 无锡江南计算技术研究所 | 一种即时编译系统中的栈运算优化方法 |
CN103106097B (zh) * | 2013-03-12 | 2016-02-10 | 无锡江南计算技术研究所 | 一种即时编译系统中的栈运算优化方法 |
CN103942100A (zh) * | 2014-05-09 | 2014-07-23 | 内蒙古中大传媒发展有限公司 | 一种基于中间件架构下java栈的多线程实现方法 |
CN104536810A (zh) * | 2014-12-18 | 2015-04-22 | 北京奇虎科技有限公司 | 一种基于栈的异常检测方法和装置 |
CN104536810B (zh) * | 2014-12-18 | 2018-05-11 | 北京奇虎科技有限公司 | 一种基于栈的异常检测方法和装置 |
CN104978154A (zh) * | 2015-07-27 | 2015-10-14 | 武汉天喻信息产业股份有限公司 | 一种基于缓存操作的flash快速读写方法及系统 |
CN106844103A (zh) * | 2017-01-16 | 2017-06-13 | 山东大学 | 非易失处理器备份容量设定、内存备份方法及系统 |
CN106844103B (zh) * | 2017-01-16 | 2019-05-21 | 山东大学 | 非易失处理器备份容量设定、内存备份方法及系统 |
CN107193629A (zh) * | 2017-04-07 | 2017-09-22 | 上海交通大学 | 基于非易失性内存与Java虚拟机的新型数据管理方法 |
CN111443991A (zh) * | 2020-03-26 | 2020-07-24 | 恒宝股份有限公司 | 智能卡控制方法、装置及智能卡 |
CN111443991B (zh) * | 2020-03-26 | 2023-06-23 | 恒宝股份有限公司 | 智能卡控制方法、装置及智能卡 |
Also Published As
Publication number | Publication date |
---|---|
CN102681866B (zh) | 2015-07-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102681866B (zh) | 一种运行Java程序的方法和装置 | |
CN102473223B (zh) | 信息处理装置以及信息处理方法 | |
US7856637B1 (en) | Runtime emulating static thread local storage of portable executable software code | |
CN110534151B (zh) | 实现写入前擦除的方法、装置、计算机设备及存储介质 | |
US10795997B2 (en) | Hardened safe stack for return oriented programming attack mitigation | |
US9213531B2 (en) | Methods to eliminate extra memory loads while accessing global variables in position independent code | |
KR101059633B1 (ko) | 멀티태스킹 가상 머신을 위한 힙 구성 | |
US20090228875A1 (en) | Method and System for Reducing Disk Allocation by Profiling Symbol Usage | |
JP4086791B2 (ja) | コンパイラプログラム、動的コンパイラプログラム、再現コンパイラプログラム、再現コンパイラ、コンパイル方法、及び記録媒体 | |
EP2341441A2 (en) | Methods and apparatus to perform adaptive pre-fetch operations in managed runtime environments | |
CN109739824B (zh) | 日志获取方法及设备 | |
CN111581010B (zh) | 一种读操作处理方法、装置、设备及可读存储介质 | |
US8838996B2 (en) | Non-transitory computer readable medium, program protection apparatus, and program protection method | |
US9158545B2 (en) | Looking ahead bytecode stream to generate and update prediction information in branch target buffer for branching from the end of preceding bytecode handler to the beginning of current bytecode handler | |
US10359971B2 (en) | Storing memory profile data of an application in non-volatile memory | |
US6625806B1 (en) | Language processing method and language processing system improving use efficiency of cache memory | |
KR100818919B1 (ko) | 메소드 호출 방법 및 이를 이용한 자바 가상 머신 | |
KR100597414B1 (ko) | 데이터 처리 장치 및 이를 이용한 레지스터 할당 방법 | |
CN110825421A (zh) | 一种固件升级方法、系统及可读存储介质 | |
US20090265156A1 (en) | Dynamically varying simulation precision | |
US10592329B2 (en) | Method and electronic device for continuing executing procedure being aborted from physical address where error occurs | |
TWI274996B (en) | Method for protecting data stored in a hard disk | |
CN113031956A (zh) | 程序编译方法和装置以及程序运行方法和装置 | |
US20050027940A1 (en) | Methods and apparatus for migrating a temporary memory location to a main memory location | |
KR100928865B1 (ko) | 컴퓨터 시스템에서의 스택 확장 및 보호 방법과 그 장치 |
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 |