Java Lua堆栈溢出
我正在开发一个Java应用程序,它使用Kahlua来编写嵌入式Lua脚本。在调用了很多函数之后,它总是会崩溃,导致堆栈溢出。。。是否需要执行一些操作来从堆栈中删除未使用的调用帧?您必须确保从每个方法调用中返回。例如:Java Lua堆栈溢出,java,lua,Java,Lua,我正在开发一个Java应用程序,它使用Kahlua来编写嵌入式Lua脚本。在调用了很多函数之后,它总是会崩溃,导致堆栈溢出。。。是否需要执行一些操作来从堆栈中删除未使用的调用帧?您必须确保从每个方法调用中返回。例如: ...main(...){ displayMenu(); } void displayMenu(){ System.out.println("1.Do A. \n2.Do B"); int q = readInt; if (q==1){
...main(...){
displayMenu();
}
void displayMenu(){
System.out.println("1.Do A. \n2.Do B");
int q = readInt;
if (q==1){
doA();
}else{
doB();
}
}
void doA(){
.....
displayMenu()
}
void doB(){
....
displayMenu();
}
使堆栈不爆炸的一种方法是执行以下操作:
...main(...){
while(true){displayMenu()};
}
void displayMenu(){
System.out.println("1.Do A. \n2.Do B");
int q = readInt;
if (q==1){
doA();
}else{
doB();
}
}
void doA(){
.....
}
void doB(){
....
}
这样,所有调用都返回到基本级别。您必须确保从每个方法调用中返回。例如:
...main(...){
displayMenu();
}
void displayMenu(){
System.out.println("1.Do A. \n2.Do B");
int q = readInt;
if (q==1){
doA();
}else{
doB();
}
}
void doA(){
.....
displayMenu()
}
void doB(){
....
displayMenu();
}
使堆栈不爆炸的一种方法是执行以下操作:
...main(...){
while(true){displayMenu()};
}
void displayMenu(){
System.out.println("1.Do A. \n2.Do B");
int q = readInt;
if (q==1){
doA();
}else{
doB();
}
}
void doA(){
.....
}
void doB(){
....
}
这样,所有调用都会返回到基本级别。尽可能使用尾部调用,它们不会占用堆栈插槽:
function foo ( )
return bar()
end
尽量使用尾部调用,它们不会占用堆栈插槽:
function foo ( )
return bar()
end
在标准Lua中,可以使用
Lua\u pop
函数从Lua堆栈中删除项。有关此用法的提示,请参阅
如果重复调用代码,最简单的方法是在处理之前存储堆栈的高度,然后恢复:
int top = lua_gettop(L);
... /* some processing involving the stack*/
lua_settop(L, top);
现在,我不知道如何在卡鲁亚实现这一点。但是在源代码中,我看到了
LuaCallFrame.getTop()
和LuaCallFrame.setTop()
,因此代码应该类似。在标准Lua中,可以使用Lua\u pop
函数从Lua堆栈中删除项。有关此用法的提示,请参阅
如果重复调用代码,最简单的方法是在处理之前存储堆栈的高度,然后恢复:
int top = lua_gettop(L);
... /* some processing involving the stack*/
lua_settop(L, top);
现在,我不知道如何在卡鲁亚实现这一点。但是在源代码中,我看到了
LuaCallFrame.getTop()
和LuaCallFrame.setTop()
,因此代码应该是类似的。如果您正确使用了Kahlua框架,那么从函数返回时堆栈应该自动清理。如果不是这样,您已经发现了一个bug,我非常希望有一个关于它的bug报告:)
最好是(接近)暴露问题的最小测试用例。如果您正确使用Kahlua框架,则从函数返回时堆栈应自动清理。如果不是这样,您已经发现了一个bug,我非常希望有一个关于它的bug报告:)
最好是一个(接近)暴露问题的最小测试用例。请提供更多信息,我们无法回答此问题。很抱歉,您在理解上有困难。我使用自己的活动系统;脚本可以使用link()全局函数添加钩子。当需要调用某个事件时,程序将遍历链接到它的所有Lua函数,并使用适当的参数调用它们。但是,在调用太多事件后,Lua库(不是Java)抱怨堆栈溢出。如果是关于Kahlua的问题,为什么这个问题被标记为luaj?请提供更多信息,我们无法回答。很抱歉,您在理解上有困难。我使用自己的活动系统;脚本可以使用link()全局函数添加钩子。当需要调用某个事件时,程序将遍历链接到它的所有Lua函数,并使用适当的参数调用它们。但是,在调用太多事件后,Lua库(不是Java)抱怨堆栈溢出。如果是关于Kahlua,为什么这个问题被标记为luaj?我说的是Lua堆栈溢出,不是Java堆栈溢出。我说的是Lua堆栈溢出,不是Java堆栈溢出。我的问题不是脚本使用了太多堆栈槽,但如果重复运行,相同的代码会填满堆栈。我所需要知道的只是如何在完成调用后从堆栈中删除它们。我的问题不是脚本使用了太多的堆栈插槽,而是如果重复运行,相同的代码会填满堆栈。我所需要知道的就是如何在完成调用后从堆栈中删除它们。