2023年6月22日发(作者:)
java如何解决栈溢出问题_如何解决栈溢出1,什么是栈溢出?因为栈⼀般默认为1-2m,⼀旦出现死循环或者是⼤量的递归调⽤,在不断的压栈过程中,造成栈容量超过1m⽽导致溢出。2,解决⽅案:⽅法⼀:⽤栈把递归转换成⾮递归通常,⼀个函数在调⽤另⼀个函数之前,要作如下的事情:a)将实在参数,返回地址等信息传递给被调⽤函数保存; b)为被调⽤函数的局部变量分配存储区;c)将控制转移到被调函数的⼊⼝. 从被调⽤函数返回调⽤函数之前,也要做三件事情:a)保存被调函数的计算结果;b)释放被调函数的数据区;c)依照被调函数保存的返回地址将控制转移到调⽤函数.所有的这些,不论是变量还是地址,本质上来说都是"数据",都是保存在系统所分配的栈中的. 那么⾃⼰就可以写⼀个栈来存储必要的数据,以减少系统负担。⽅法⼆:使⽤static对象替代nonstatic局部对象在递归函数设计中,可以使⽤static对象替代nonstatic局部对象(即栈对象),这不仅可以减少每次递归调⽤和返回时产⽣和释放nonstatic对象的开销,⽽且static对象还可以保存递归调⽤的中间状态,并且可为各个调⽤层所访问。⽅法三:增⼤堆栈⼤⼩值当创建⼀个线程的堆栈时,系统将会保留⼀个链接程序的/STACK开关指明的地址空间区域。但是,当调⽤CreateThread或_beginthreadex函数时,可以重载原先提交的内存数量。这两个函数都有⼀个参数,可以⽤来重载原先提交给堆栈的地址空间的内存数量。如果设定这个参数为0,那么系统将使⽤/STACK开关指明的已提交的堆栈⼤⼩值。后⾯将假定我们使⽤默认的堆栈⼤⼩值,即1MB的保留区域,每次提交⼀个页⾯的内存。Java在创建线程时设置栈⼤⼩:thread(threadgroup group, runnable target, string name, long stacksize)分配新的 thread 对象,以便将 target 作为其运⾏对象,将指定的 name 作为其名称,作为 group 所引⽤的线程组的⼀员,并具有指定的堆栈⼤⼩。Java虚拟机的堆⼤⼩如何设置:命令⾏java –Xms128m //JVM占⽤最⼩内存–Xmx512m //JVM占⽤最⼤内存–XX:PermSize=64m //最⼩堆⼤⼩–XX:MaxPermSize=128m //最⼤堆⼤⼩
发布者:admin,转转请注明出处:http://www.yc00.com/web/1687430395a9435.html
评论列表(0条)