`

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.lang.OutOfMemoryErrorJava heap space的情况.docx

    在Java程序中,`java.lang.OutOfMemoryError: Java heap space` 是一个常见的错误,意味着程序在运行过程中耗尽了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 虚拟机 内存和栈 分析工具 ha456.rar

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

    Java中堆内存和栈内存详解

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

    Java内存结构

    Java内存结构是Java编程语言中的一种基本概念,它决定了Java程序的运行机制。Java内存结构可以分为六个部分:寄存器、栈、堆、静态存储、常量存储和非RAM存储。其中,堆和栈是Java程序运行时最重要的两个存储区域。 ...

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

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

    java实现内存动态分配

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

    JAVA 内存设置原理

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

Global site tag (gtag.js) - Google Analytics