`
xudongcsharp
  • 浏览: 467514 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 堆与栈

 
阅读更多
栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。

堆(heap):用于存放由new创建的对象和数组

静态、常量区(data segment):存放的是静态变量(类变量)或是常量。

方法区(codesegment):存放的是对象的方法。因此即使new出多个对象也是只是存在一个方法。


栈的优势:存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享。

堆的优势:可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。


当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。


A a = new A(); A中含有一个work方法,2个成员变量a,b。那么对应的内存分配为
则 a是分配在栈内存中。里面存放了一个指向堆内存中存放的new A()的地址。
new A()会导致在堆内存中分配一块空间,该内存中的A对象同时会含有a和b。
work()方法会在codesegment区中分配内存。
如果此时 A b = a;则表示把a的值复制给b,即b的值为a中保存的地址
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics