java 栈和堆 的区别
2个回答
展开全部
java堆和栈的区别Java中内存分成两种:一种是栈stack,一种是堆heap。函数中的一些基本类型的变量(int,float)和对象的引用变量(reference)都在函数的栈中,马克-to-win,(工作于编译阶段,生成class文件之前)分配。存取速度快,稍逊于寄存器,比堆快,函数执行完后,Java会自动释放掉为函数里变量开辟的栈内存空间,该内存空间可以立即被另作他用。堆heap内存用来存放由new创建的对象和数组。堆内存,负责运行时(runtime,执行生成的class文件时)数据,由JVM的自动管理。缺点是,存取速度较慢。栈中的引用变量指向堆中的对象或数组。栈中有共享池的概念,比如下面例子中,sz="hello";在栈中创建一个String对象引用变量sz,然后看看栈中有没有"hello",如果没有,则将"hello"存放进栈,并令sz指向”hello”,如果已经有”hello”则直接令sz指向“hello”。对于int,float类型的变量也是一样的有这种共享池的概念,注意上述的工作是在compile(编译)的阶段完成的,而不是runtime运行时完成的。对于下面程序中:ss0=newString("hello");是用new()来新建对象的,存于堆中。每调用一次就会创建一个新的对象。当然从节省空间的角度来讲,肯定不如str="hello",有童鞋一定问,那要它有什么用?当时设计编译器时,为什么要设计它?马克-to-win,那我请问你,如果在你编程序时,你还不知道字符串内容怎么?这时就用到newString,所以,什么都有什么的用处。publicclassTest{publicstaticvoidmain(Stringargs[]){Stringstr,str1,ss0,ss1,ss2,ss3,ss4;str="hello";。。。。。。。。。。。。。。。。详情网上找“马克-to-win”,参考他的网站或他的百度空间:java第2章的内容
展开全部
按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的.
静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求.
栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。
静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求.
栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询