`
supportopensource
  • 浏览: 521863 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

栈与堆:生存空间

阅读更多
在Java中,程序员会在乎内存中的两种区域:对象的生存空间堆(heap)和方法调用及变量的生存空间栈(stack)。当Java虚拟机启动时,它会从底层的操作系统取得一块内存,以及你是否能够调整它都要看Java虚拟机与平台的版本而定。但通常你对这些事情无法加以控制。

所有的对象都存活于可垃圾回收的堆上,方法调用在栈中执行,局部变量存活于栈中。

当你调用一个方法时,该方法会放在调用栈的栈顶。实际上被堆上栈的是堆栈块,它带有方法的状态,包括执行到哪一行程序以及所有的局部变量的值。栈顶上的方法是目前正在执行的方法。

局部变量和方法的参数都是被声明在方法中。它们是暂时的,且生命周期只限于方法被放在栈上的这段期间(也就是方法调用至执行完毕为止)。如果局部变量时基本数据类型,变量放在栈上;如果局部变量是个引用变量,变量本身会放在栈上,该变量引用的对象会在堆上。
例如:
public class B(){}
public class A{
	public void a(){
		int i = 1;
		b();
        }
        public void b(){
	       B b = new B();
        }
}




实例变量是被声明在类而不是方法里面。它们代表每个独立对象的“字段”(每个实例都能有不同的值)。实例变量存在于对象所属的堆空间上。如果实例变量是基本数据类型的,则Java会依据基本数据类型的大小为该实例变量留下空间(位于对象所属的堆空间上),例如int型需要32位;如果实例变量是引用类型时,Java会为该引用变量留下空间(位于对象所属的堆空间上),并且另外为该引用变量指向的对象再分配一块堆空间(前提是其中的对象已初始化),最终引用变量与其所引用的对象都是在堆上。

例如:
public class B{
	int i = 1;
}
public class A{
	int a = 1;
	long l = 12456;
	B b = new B();
}



  • 大小: 17.6 KB
  • 大小: 21.5 KB
分享到:
评论
1 楼 xiaofan_0204 2013-04-16  

相关推荐

    关于Java栈与堆的思考

    - **大小与生存期确定**:栈中存储的数据大小和生命周期在编译时即可确定,缺乏灵活性。 - **数据可以共享**:栈中的数据(特别是基本类型)可以被多个变量引用,从而实现数据共享。 #### 2. 堆(Heap) 堆是Java...

    堆和栈详解

    堆和栈是计算机内存管理中的两个重要概念,它们在程序执行过程中起着至关重要的作用。在深入探讨这两个概念之前,我们需要明确一点:堆和栈在内存结构上有着本质的区别。 栈(Stack)是一种线性数据结构,其特点是...

    区别Java中堆与栈区别Java中堆与栈

    Java 中堆与栈的区别 Java 中的堆和栈是两个不同的内存区域,分别用于存放不同类型的数据。堆是一个运行时数据区,类的对象从中分配空间,通过new、newarray、anewarray 和 multianewarray 等指令建立,垃圾回收器...

    C++ 静态存储区 栈 堆的区别.txt

    ### C++中的静态存储区、栈与堆的区别 在C++编程语言中,根据变量的存储方式和生命周期,可以将内存区域大致分为四个部分:静态存储区、栈、堆以及未初始化的数据段(BSS)。其中,静态存储区、栈与堆是程序运行时...

    java里的堆和栈

    在Java编程中,“堆”与“栈”的概念至关重要。它们是程序运行时内存管理的核心部分。本文将深入探讨Java中堆和栈的区别及其工作原理。 #### 二、Java内存区域划分 在Java中,内存主要划分为以下几部分: 1. **栈...

    C++中堆和栈的区别

    栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。...

    Java堆和栈的区别

    但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(int, short, long, byte, float, double, boolean, char)和对象句柄。栈有一个很重要的特殊性,就是存在栈中的...

    Java中堆和栈的区别

    一旦在栈中分配了空间,其大小就不能改变,生存期也由编译器决定。 4. 数据共享:栈中的数据可以被多个变量共享,例如,当两个变量都初始化为3时,它们可能指向栈中同一个3的值,改变其中一个变量的值不会影响另一个...

    Java机制下的栈和堆.pdf

    栈中的数据大小和生存期在编译时就已经确定,所以对于需要快速存取和生命周期短暂的数据,栈是理想的选择。 堆内存则更为灵活,它用于存储那些在运行时动态分配大小的对象。通过new操作符创建的对象和数组都存储在...

    关于堆和栈的那些事共9页.pdf.zip

    2. 存储空间:栈的空间有限,通常为几MB;堆空间较大,取决于系统的实际内存。 3. 内存效率:栈内存分配和释放速度快,而堆内存操作相对较慢。 4. 管理方式:栈由系统自动管理,堆则需程序员自己管理,可能导致内存...

    Java 中的堆和栈.doc

    栈内存中的数据大小和生存期在编译时是确定的,这使得它非常适合存储基本类型(如`int`, `double`, `boolean`等)和对象的引用。但是,栈内存不允许动态分配内存,因此其灵活性较低。 堆内存则提供了动态内存分配的...

    java中的栈(深层了解java虚拟机对对象的内存分布)

    与栈相比,堆的最大优点在于能够动态分配内存,其大小和生存周期无需事先告知编译器,由Java的垃圾回收机制自动管理。这种灵活性使得堆成为复杂数据结构和大型对象的理想选择。然而,动态内存分配的代价是存取速度...

    Java中的堆和栈[定义].pdf

    但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量和对象句柄。 栈中的数据共享 栈中的数据可以共享,这意味着,如果我们定义了多个相同的基本类型的变量,Java ...

    java中堆(heap)和堆栈(stack)有什么区别

    栈中的数据生存空间一般在当前 scopes 内(即由 {…} 括起来的区域)。栈的优势是,存取速度比堆要快,仅次于直接位于 CPU 中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。 堆(heap...

    C++中静态存储区与栈以及堆的区别详解

    - 堆内存的生存期由程序员控制,可以跨函数边界使用。 - 不释放堆内存可能导致内存泄漏,影响程序性能甚至导致程序崩溃。 例子分析: - 在例一中,字符串常量"Hello World1"存放在静态存储区,不可修改。而数组a...

    静态存储区 堆 栈

    五、栈区与堆区的区别 栈区和堆区的区别在于,栈区中的内存是临时的,函数执行结束时自动释放,而堆区中的内存需要手动释放。例如,char* f1()函数返回的内存是临时的,函数执行结束时自动释放,而char* f2()函数...

    java 虚拟机 内存和栈 分析工具 ha456.rar

    5. **本地方法栈**:与Java方法栈类似,但主要用于支持Java虚拟机执行native方法。 针对Java内存和栈的分析,我们可以利用以下工具进行深入研究: - **JVisualVM**:这是JDK自带的一个强大的多合一性能分析工具,...

    java中堆和栈的区别.pdf

    栈中的内存分配和释放是自动的,当变量的作用域结束时,Java会自动释放掉为该变量所分配的内存空间。栈的优点是存取速度快,缺点是存在栈中的数据大小和生存期必须是确定的,缺乏灵活性。 堆(Heap)是另一块内存...

    Java中堆与栈的区别.pdf

    当一个变量在栈中声明并赋值时,系统会为其分配固定大小的空间,并且生命周期是确定的——一旦变量的作用域结束,系统就会自动回收这部分内存。对于基本类型,例如int、float、boolean等,它们的值直接存储在栈中,...

Global site tag (gtag.js) - Google Analytics