heap和stack有什么区别

堆和栈是两种不同的内存区域,堆用于动态分配内存,程序员负责申请和释放;栈由系统自动分配,适用于函数调用时的局部变量。栈的内存有限,通常小于1MB,而堆的内存大小取决于系统的虚拟内存。栈的分配速度更快,但控制权在系统;堆虽然较慢且可能产生碎片,但提供更大的灵活性。此外,Java中的字符串常量池特性展示了栈和堆的交互作用。
摘要由CSDN通过智能技术生成

从以heapstack的区 

1. 方式 
stack:例如局部  int b; 自动在栈b 
heap:,并cmallocJavanew Object()的形式开 2. 响应 
stack大于为程报异 

heap操作系统地址程序 
会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的间分配给程序。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余那部分重新放空闲链 

3.  
stack址扩的数是一的内区域意思最大是系统  WINDOWS2M1M总之的常数如果申请空间将提overflow。因间较小。 

heap:堆向高址扩展数据结,是连续的存区域这是于系统用链表存储空闲内地址,自然链表的遍高地小受限于计算内存,堆获也比 

4. 较: 

stack速度法控 

heapnew的内存,且容碎片,用起便 

5. heapstack 
stack 一个的下语句地址然后在大数的 C 中,参数然后。注态变是不的。 

当本局部指向最开就是主函下一条续运行。 

heap头部用一。堆员安

 int b = 3   
  int a = 3个变a然后查找3地址没找到3这个a3int  b =  3b后,3这个便b3ab3 

  特别注意的是,这种字面值的引用与类对象的引用不同。假定两个类对象的引用同指向一个对象,如一个对象引用变量修改了这个对象的内部状态,那么另一个对象引用变量也即刻反映出这个变化。相反,通过字面的引用致另引用况。义完 a   b ,再令 a=4b 等于 4 3编译 a=4时, 4 的字值,地址4 如果经有a这个a 变不b的值 

  Integer, String, Double数据类型类数据全部存在中,Java  new()语句地告译器,在态创但缺占用更 

4).JVM线自己线程javastackframesjavastackc不允许直pushpop frames frames heap分配javastack分配javaheap线程共  runtime data 里面数组heapJVM时创 

  5). String 殊的包类数。即 String str  =  new  String("abc");的形式,也可String str = "abc"式来(JDK 5.0Integer i = 3;式,因为值是不能用的, String。而在 JDK  5.0 这种表达是可以为编译器后台 Integer  i  =  new Integer(3))。前是规Java,而全部new()的形式来String str = "abc",并new()建实述原其实没有。 

5.1). String str = "abc"Java部将个步骤: 
  (1)strString用变String str   
  (2)存放"abc"地址果没字面"abc"地址着创一个Stringoo 指向这个地址中这个地o果已经"abc",则o并返o 

  (3)stro的地   

  的是String直接String str = "abc"种场合下其字值却在栈 

为了,我个代 

  String str1 = "abc";   

  String str2 = "abc";   

  System.out.println(str1==str2);      //true   
  注意并不str1.equals(str2)个字符串==JDK的说,只都指返回要看str1str2否都了同一个对 

  JVM了两个引str1str2但只且两对象   

  将以   

  String str1 = "abc";   

  String str2 = "abc";   

  str1 = "bcd";   

  System.out.println(str1 + "," + str2);      //bcd, abc   

  System.out.println(str1==str2);      //false   
  导致str1新对str2原来的对。上例str1值改为"bcd"JVM现在地址便,并了一新的指向 

  String设计(immutable)JVM行时据新值悄悄创建了一个新对象,然后将这个对象的地址返回给原来类的引用。这个创建过程虽说是完全自动进行的但它毕。在的环不良 

     

  String str1 = "abc";   

  String str2 = "abc";   

  str1 = "bcd";   

  String str3 = str1;   

  System.out.println(str3);      //bcd 

  String str4 = "bcd";   

  System.out.println(str1 == str4);      //true   
  str3 直接str1(str3新对象)str1创建 String  str4,并 str1 值而创建现,str4 创建新的而再 

  代码 

  String str1 = new String("abc");   

  String str2 = "abc";   

  System.out.println(str1==str2);      //false   
  建了分别     

  只要new()来新会在而且使与栈中的栈中 

  6). 类的值不 String 有的能更内部 

  7).    
  (1)使String str = "abc"定义认为String类的str可能并没肯定指向  String的引个引是否指向须根非你new()方法来显要地为准说法String用变str变量值为"abc"String。清醒除程发现bug是很 

  (2)使String str = "abc"定程速度,因JVM据栈数据的有必String str = new String("abc")概在创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。这个思想应该是享元模式思想JDK这里实现,不 

  (3)的数equals()类的对象== 

  (4)StringimmutableString变量时,使StringBuffer类,

以提 

javaheapOutOfMemoryError 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苹果牛顿吃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值