JAVA虚拟机java栈内存的问题!!

作者:超级管理员 更新时间:2017-09-13 17:57:21 来源:未知 点击:15642
最近在学习JVM,学到java栈的部分,看到书上说栈溢出是因为给栈分配的内存不够。我就在想,平时做算法问题的时候都是提倡用容器存储数据并且用循环求解(如果每次计算结果必须储存),而不用递归求解,说是递
最近在学习JVM,
学到java栈的部分,看到书上说栈溢出是因为给栈分配的内存不够。
我就在想,平时做算法问题的时候都是提倡用容器存储数据并且用循环求解(如果每次计算结果必须储存),而不用递归求解,说是递归可能导致栈溢出。但是其实用的都是线程栈的内存啊,递归多少次压了多少栈帧,换成是循环的话不也在容器里塞了多少数据吗。 我知道我这样想法肯定是错的,请各位帮忙解答下QWQ!!
-------------------------------
在JVM内存的角度来说循环到底比递归好在哪呢
-------------------------------
你所说得 算法中如果有结果相同的计算要保存下来,这种方法叫备忘录,从算法的角度上来说确实更快。
因为相同的计算公式不需要重新计算一次、
从jvm级别的方法调用压栈的角度来说,少压了一些方法回调。jvm中的栈省了空间。
给你举个例子  .
method a(i){
  if(m)
       return n;
  return a(i-1) * a(i-2);
}

楼主不嫌麻烦可以把i=10的所有调用都写出来一次,就能体会到备忘录的好处,而jvm级别的压栈需要好好看看书中的内容。
-------------------------------
引用 2 楼 u011619071 的回复:
你所说得 算法中如果有结果相同的计算要保存下来,这种方法叫备忘录,从算法的角度上来说确实更快。
因为相同的计算公式不需要重新计算一次、
从jvm级别的方法调用压栈的角度来说,少压了一些方法回调。jvm中的栈省了空间。
给你举个例子  .
method a(i){
  if(m)
       return n;
  return a(i-1) * a(i-2);
}

楼主不嫌麻烦可以把i=10的所有调用都写出来一次,就能体会到备忘录的好处,而jvm级别的压栈需要好好看看书中的内容。

你说的备忘录方法我理解,我也经常用就是不知道名字qwq。但是我思考的是,循环调用,把数据存在备忘录里和递归调用每次压栈往栈帧里存的数据大小是一样的啊,为何递归可能导致栈溢出(这里不考虑类似斐波那契数列这样可以节约计算次数的备忘录存储。我是看《剑指offer》很简单的一个算法,单链表倒置,每次的存储都不会影响到后面的计算,仅仅为了记录结果而已,书上却说递归可能栈溢出,推荐用循环,我就懵逼了)。
-------------------------------
打错了,是单链表倒序输出 ,大神求指教

引用 2 楼 u011619071 的回复:
你所说得 算法中如果有结果相同的计算要保存下来,这种方法叫备忘录,从算法的角度上来说确实更快。
因为相同的计算公式不需要重新计算一次、
从jvm级别的方法调用压栈的角度来说,少压了一些方法回调。jvm中的栈省了空间。
给你举个例子  .
method a(i){
  if(m)
       return n;
  return a(i-1) * a(i-2);
}

楼主不嫌麻烦可以把i=10的所有调用都写出来一次,就能体会到备忘录的好处,而jvm级别的压栈需要好好看看书中的内容。
-------------------------------
引用 3 楼 qq_37361576 的回复:
Quote: 引用 2 楼 u011619071 的回复:

你所说得 算法中如果有结果相同的计算要保存下来,这种方法叫备忘录,从算法的角度上来说确实更快。
因为相同的计算公式不需要重新计算一次、
从jvm级别的方法调用压栈的角度来说,少压了一些方法回调。jvm中的栈省了空间。
给你举个例子  .
method a(i){
  if(m)
       return n;
  return a(i-1) * a(i-2);
}

楼主不嫌麻烦可以把i=10的所有调用都写出来一次,就能体会到备忘录的好处,而jvm级别的压栈需要好好看看书中的内容。

你说的备忘录方法我理解,我也经常用就是不知道名字qwq。但是我思考的是,循环调用,把数据存在备忘录里和递归调用每次压栈往栈帧里存的数据大小是一样的啊,为何递归可能导致栈溢出(这里不考虑类似斐波那契数列这样可以节约计算次数的备忘录存储。我是看《剑指offer》很简单的一个算法,单链表倒置,每次的存储都不会影响到后面的计算,仅仅为了记录结果而已,书上却说递归可能栈溢出,推荐用循环,我就懵逼了)。

我觉得你是没有明白,递归跟循环调用的区别是吧?   java中的递归调用需要不断使用栈帧,计算次数一大,当然栈就报错了,
可不可以这样尝试理解一下,  循环依赖于执行结果,而递归依赖于调用。
-------------------------------
额。不知道楼主在纠结啥,递归只有在你的返回位置判断不正确的时候才会导致栈溢出,因为调用层级超过了正常值。递归是不会有问题的。难道说吃饭会噎死就不吃么。
-------------------------------
方法调用需要额外的内存,比如返回地址,方法参数,CPU寄存器,方法里定义的变量
-------------------------------
我明白了=-=,我是JVM没读明白,今天又看了下才发现。我之前以为在栈中声明的局部变量就一定一直存活是在栈中的,以为会占用栈帧内存导致线程栈溢出。后来才发现局部变量被赋给堆中的对象以后该销毁还是被销毁,所以大量的数据存在了堆中,栈内存不会溢出了。

推荐阅读

热门内容

求问大神java空指针异常

--------------------...

求问大神javaGui空指针异常

--------------------...

诡异的问题,在return的时候,出问题

--------------------...

SpringMvc中如何将数组在前台遍历

各位大佬求助,因为前台使用的是HTML ...

Ajax 跨越访问后台,返回出错

$.ajax({            ...

jdk1.8和jdk1.7中HashMa

本帖最后由kai_12于2017-09-...

明明有分号,怎么还提示没有分号

--------------------...

jsp用ajax提交form表单

没接触过ajax,找了网上的例子试了下。...

关于HQL的一个报错

本帖最后由zxy16305于2017-0...

这哪错了???

--------------------...

最新内容

求问大神java空指针异常

-------------------------------构造器内声明的jf...

求问大神javaGui空指针异常

-------------------------------39行空指针。。。...

求一个div能够拖动的代码

如题-------------------------------http://...

springboot 整合 mybatis 封装dao的问题

dao接口:public interface AdminDao {method ...

诡异的问题,在return的时候,出问题了

-------------------------------所以debug的重...

JavaObject类中的registNatives()方法实现了那些事情

百度上普遍说注册本地方法wait、notify、notifyAll、hashCo...

ajax请求成功后怎么把data数据显示到页面上

 success: function (data){         var s...

SpringMvc中如何将数组在前台遍历

各位大佬求助,因为前台使用的是HTML  没有使用jstl遍历在controll...

springmvc+websocket 拦截器进去以后到handler一直报空指针异常

严重: Servlet.service() for servlet [sprin...

JAVA虚拟机java栈内存的问题!!

最近在学习JVM,学到java栈的部分,看到书上说栈溢出是因为给栈分配的内存不够...

maven 项目运行不了

maven项目有多个模块,分别是model、dao、service、web(使用...

SSH2项目下的所有JavaBean包括Struts2的所有Action和拦截器等都受Spring IoC容器管理吗?

SSH2项目下的所有JavaBean包括Struts2的所有Action和拦截器...

下载word文件打不开

使用response 方式,使用浏览器从服务器端下载文件,文件下载成功,并且文件...

uploadify插件问题,小白求教啊!

文件都已经成功上传了,但是谷歌浏览器可以成功调用onUploadSuccess函...

php页面能够获取到后台设置的session吗?

如果前端通过JS提交了一次用户登录的表单,后台验证成功后设置了该用户登录状态的s...

Ajax 跨越访问后台,返回出错

$.ajax({            url: requestUrl,   /...

自动加载类,__autoload 是如何实现的

麻烦大神解释下 这个例子吧 什么文件名 减6 的 什么Action 的  都干嘛...

spring 配置时遇到的一个奇怪的问题

使用spring  xml 引入了properties文件  

请问写原生的php程序需要注意什么事项?如何做到安全最大化?linux环境

因为最近在写一个微信小程序。功能很简单主要有1:手机号注册(通过短信形式)2:用...

引用其他人写的方法出现问题,大家帮忙看看,谢谢了

错误如下图上面是别人写的加载天地图的方法,在他给的工程里可以运行,我新建一个挪过...