`

java内存中heap和stack的区别

    博客分类:
  • jvm
 
阅读更多

java中堆栈对比

 

栈的优点是存取速度快,至少比堆快。但由于栈自身数据结构的特点,导致存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。(这里就可见方法栈为什么用stack这种数据结构了,首先每个方法对应的形参和非静态变量数量和大小是固定的,第二在调用方法时生成栈,压栈该方法结束时出栈,生命周期是确定的。)

 

堆的优势是可以动态分配内存大小,也不用管他的生命周期,jvm的垃圾收集器会在适当时候自动收走不再使用的数据。缺点是堆得存取速度较栈为慢。

 

方法中不同类型数据的定义与存储

 

一种是基本类型(primitive types)共8种,int、short、long、byte、float、double、boolean、char。基本类型定义是通过如 int a = 3;的形式来定义的,这里a称为自动变量。自动变量存的是字面值而不是类的引用。这里a是一个指向int类型的引用,指向3这个字面值。这些字面值大小可知,生存期可知存于栈中,另外栈有个很重要的特殊性,就是存在栈中的数据可以共享。如:

int a = 3;

int b = 3;

编译器先处理int a =3;首先它会在栈中创建一个变量为a的引用,然后在栈中查找字面值为3的地址,没找到就开辟一个存放3的地址,再把a指向这个地址。int b = 3; 则b指向这个地址。

 

特别注意的是字面值的引用与对象的引用不同。这时另b = 4;不会修改这个字面值,而是重新再栈中寻找4的地址。

 

 

String比较特殊

String a = new String("xx");的形式创建则是在堆中建一个新对象,a的引用指向这个对象

String a = “xx”;的话(小细节,不同于Float等String并没有string这个数据类型所以怎么都要指向String对象)

1.先定义一个名为a的堆String类对象的引用;

2.在栈中查找“xx”值的地址,没有则开辟存放字面值“xx”的地址,接着创建一个新的String类的对象o,并将o的字符串值指向这个地址,并在栈中该地址旁记下这个对象o。返回这个o地址给a

 

String a = "abc"

String b = "abc"

System.out.println( a == b ) //true

b = "bc"  则b指向新地址

 

事实上String类被设计成不可改变(immutable)的类,当String变量需要经常变换值时,应该考虑使用StringBuffer类来提高效率。

 

另:equal比较值,==比较是否同一个对象

分享到:
评论

相关推荐

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

    "Java 中堆(heap)和堆栈(stack)的区别" Java 中堆(heap)和堆栈(stack)是两个不同的内存区域,分别用于存储不同的数据类型和对象。堆栈(stack)是 Java 中的一种内存区域,用于存储基本类型的变量和对象的...

    堆(heap)与栈(stack)的区别

    堆(heap)与栈(stack)是计算机内存管理中的两种基本数据结构,用于存储程序运行时产生的临时变量。在C语言中,这两种内存区域有非常明确的区分,对于理解程序的内存分配和回收具有重要意义。 首先,栈是一种特殊...

    ibm HeapAnalyzer java内存分析工具 ha457.jar

    IBM HeapAnalyzer是一款强大的Java内存分析工具,主要用于诊断和解决Java应用程序中的内存泄漏问题。这款工具通过对Java堆内存的深入分析,帮助开发者定位那些占用过多内存的对象,从而优化应用性能。在Java开发过程...

    The Run-time Heap and Stack

    在IT领域,尤其是在操作系统与编程语言的运行时环境中,“运行时堆和栈”(The Run-time Heap and Stack)是理解程序内存管理的核心概念。本文旨在深入解析这一主题,结合提供的部分文档内容,详细阐述堆和栈的区别...

    java内存机制及异常处理

    Java内存机制是Java虚拟机(JVM)的关键组成部分,它管理着程序运行时的数据存储。在Java中,内存主要分为以下几个区域: ...正确理解和运用Java内存机制以及异常处理机制对于开发健壮、高效的Java应用程序至关重要。

    java解决nested exception is java.lang.OutOfMemoryError Java heap space

    Java内存主要分为三个区域:堆(Heap)、栈(Stack)和方法区(Method Area),其中堆是用于存储对象实例的主要区域,当堆空间不足时,就会抛出`OutOfMemoryError: Java heap space`。 1. **调整JVM堆大小**:可以...

    Java内存泄露及内存无法回收解决方案

    Java内存管理是编程中至关重要的一个环节,尤其是对于大型、长时间运行的应用来说,内存泄漏和内存无法回收可能导致系统性能下降,甚至导致系统崩溃。本文将深入探讨Java内存泄露的原理,分析内存无法回收的原因,并...

    Java中堆内存与栈内存分配浅析

    本文将深入探讨Java中堆内存与栈内存的分配机制,并通过对比分析它们之间的差异,帮助读者更好地掌握Java内存管理的核心概念。 #### 二、堆内存与栈内存概述 ##### 1. 堆内存 堆内存是Java虚拟机(JVM)用于存储...

    java内存管理 ppt

    在Java中,内存主要分为堆内存(Heap)和栈内存(Stack),还有方法区(Method Area)、程序计数器(PC Register)以及本地方法栈(Native Method Stack)。下面将深入探讨这些内存区域以及相关的垃圾收集和并发收集...

    JAVA内存溢出详解.doc

    Java内存主要分为堆内存(Heap)和栈内存(Stack),堆是存储对象实例的主要区域,而栈主要用于存储基本类型和对象引用。除此之外,还有方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native ...

    Java内存监视器.rar

    Java内存模型主要分为三个区域:堆内存(Heap)、栈内存(Stack)和方法区(Method Area),在Java 8及以后版本,还包含了元空间(Metaspace)。每个区域都有其特定的用途: 1. **堆内存**:存储所有对象实例和数组...

    记录java.lang.OutOfMemoryErrorJava heap space的情况.docx

    在Java程序中,`java.lang.OutOfMemoryError: Java heap space` 是一个常见的错误,意味着程序在运行过程中耗尽了JVM分配的堆内存。这个错误通常发生在创建大量对象或者单个对象占用过多内存时。 一、问题描述与...

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

    Java内存主要分为堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)五大部分: 1. **堆**:Java对象主要存储在堆中,它是所有线程共享的一块区域。...

    Java中堆内存和栈内存详解

    本文将深入探讨Java中的两种主要内存区域:堆内存(Heap Memory)和栈内存(Stack Memory)。这两种内存分别承担着不同的角色,对于程序员理解和优化Java程序至关重要。 #### 二、栈内存 栈内存主要用于存储方法的...

    java内存分析-内存泄露问题.rar

    Java内存主要分为三个区域:堆(Heap)、栈(Stack)和方法区(Method Area)。堆用于存储对象实例,栈用于存储方法调用及局部变量,而方法区则存储类信息、常量、静态变量等。在Java虚拟机(JVM)中,垃圾收集器...

    java实现内存动态分配

    这些区域在Java内存模型中同样占有重要地位,但在“java实现内存动态分配”的上下文中,主要关注堆和栈的动态分配。 综上所述,Java实现内存动态分配涉及到对堆内存、栈内存的理解,以及对垃圾回收机制的掌握。通过...

    JAVA 内存设置原理

    ### JAVA内存设置原理详解 在深入探讨JAVA内存设置原理之前,我们先理解一下JVM(Java虚拟机)的内存管理机制。JVM是JAVA运行时环境的核心,它负责执行JAVA字节码,同时管理程序运行时的内存分配与回收。JVM的内存...

    java内存模型.pdf

    标题和描述中提及的知识点主要围绕Java内存模型(JMM),JVM内存结构,包括堆栈讲解,以及本机内存管理等内容。以下是对这些知识点的详细阐述: ### Java内存模型(JMM) #### JMM简介 Java内存模型(JMM)是Java虚拟机...

    Java内存模型分析与其在编程中的应用.pdf

    总结来说,Java内存模型定义了对象的内存布局以及在多线程环境中对共享变量访问的规则,它为Java程序员提供了一个高级的内存模型来保证内存的有序性和一致性。理解和应用Java内存模型是编写高效且稳定Java程序的关键...

Global site tag (gtag.js) - Google Analytics