解释内存中的栈(stack)、堆(heap)和静态区
(staticarea)的⽤法。
堆区:
1.存储的全部是对象,每个对象都包含⼀个与之对应的class的信息。(class的⽬的是得到操作指令)
2.jvm只有⼀个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引⽤,只存放对象本⾝.
3.⼀般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。
栈区:
1.每个线程包含⼀个栈区,栈中只保存基础数据类型的对象和⾃定义对象的引⽤(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引⽤)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执⾏环境上下⽂、操作指令区(存放操作指令)。
4.由编译器⾃动分配释放,存放函数的参数值,局部变量的值等.
static修饰的变量
静态区/⽅法区;
1.⽅法区⼜叫静态区,跟堆⼀样,被所有的线程共享。⽅法区包含所有的class和static变量。
2.⽅法区中包含的都是在整个程序中永远唯⼀的元素,如class,static变量。
3.—,全局变量和静态变量的存储是放在⼀块的,初始化的全局变量和静态变量在⼀块区域,未初始化的全局变量和未初始化的静态变量在相邻的另⼀块区域。
String str = newString("hello");
上⾯的语句中变量str放在栈上,⽤new创建出来的字符串对象放在堆上,⽽"hello"这个字⾯量放在静态区
运⾏原理;
程序的运⾏场所是内存,栈和堆是进程的虚拟内存中的两部分区域。
当程序被执⾏时,程序代码,所创建的变量、常量等都会被压⼊栈空间⾥,栈是程序代码的执⾏区域。栈的内存地址是连续的且被⼀⼀记录,所以说当你创建了⼀个变量(⽐如int var = 1),我们就可以
通过var这个变量来访问变量的内容。在这⾥,var就存放在栈中,它的地址已经默认被编译器计算好了,调⽤过程也不需要你涉及到有关地址的操作。更直观的感受是数组,数组⾥的元素在栈⾥⾯是连续排放的,相邻两个元素的地址相差1。
⽽堆是不同于栈的另⼀部分区域,系统会给每个程序分配⼀部分栈空间让他们能够运⾏起来,问题就是栈空间必然存在不够⽤的问题,⽽堆不属于程序,堆是独⽴的,是公⽤的。只要你malloc(sizeof(SIZE_YOU_WANT)),就可以得到相应⼀部分的堆空间。
有栈,为什么⽤堆?
::栈⾥⾯的东西有⽣命周期,说俗点就是变量作⽤域,你在函数内部创建⼀个变量,函数调⽤结束这个变量就没了。⽽堆⾥⾯的东西独⽴于你的程序,malloc()之后,除⾮你free()掉,否则⼀直存在。
为什么⽤堆少?
::⿇烦!
有什么要注意?
堆⾥⾯申请的东西,是随机分配的,不像栈⾥⾯的地址都已经计算好了。所以申请了堆空间之后⼀定要创建⼀个指针保存你说申请到的堆空间的地址。不然就不到你申请的空间了。
既然涉及到指针,请注意⽤之前检查⼀下指针空不空的问题。
堆空间的东西申请好,在⽤完之后⼀定要free()掉,以防⽌堆溢出。
说到安全性,还真是挺⿇烦的。(纯⼿打)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。