`

java 栈 堆 常量池的理解

阅读更多
java 堆,栈 存储分享

1.寄存器 最快的存储区,有编译器根据需求进行分配,程序无法控制。
2.栈,存放基本类型的变量数据和对象的引用地址,对象本身不存放在栈中,而是存放在堆 或者 常量池中(字符串常量)
3.堆,存放所有new出来的对象。

4.静态域,存放静态成员。

5.常量池,存放字符串常量和基本类型常量(public static final)

6.栈和常量池中的对象可以共享,堆中的对象可以不共享。
栈中的数据大小,生命周期可以确定的,当没有引用指向数据时,这个数据就会消失。
堆中的对象由gc负责回收,大小和生命周期不需要确定,具有灵活性。

7.对于字符串,其对象的引用都是存放在栈中,如果编译期已经创建好,就存放在常量池中,如果new 菜存放在堆中,
两个字符串常量相加 等于存放在常量池中,如何两个变量相加相当于new 存放在堆中。

常量池 是在堆中开辟一个很小的内存。
Java把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。

  堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。
分享到:
评论

相关推荐

    java内存分配之常量池,栈,堆1

    在Java中,内存主要分为四个区域:寄存器、栈、堆和方法区(包括常量池)。以下是这四个区域的详细说明: 1. **寄存器**: 这是计算机硬件的一部分,用于存储非常快速访问的数据。在Java中,寄存器主要由JVM直接管理...

    Java堆、栈和常量池——内存剖析

    ### Java堆、栈和常量池——内存剖析 #### 寄存器 寄存器作为最快的存储区域之一,由编译器自动管理分配与回收,它位于CPU内,用于存储临时变量,例如局部变量和一些操作数。由于寄存器的数量有限且由编译器自动...

    Java堆,栈和常量池详解

    ### Java堆、栈和常量池详解 #### Java内存模型概览 在深入探讨Java中的堆、栈以及常量池之前,我们先来简要回顾一下Java内存模型的基本概念。Java程序运行时会使用到不同的内存区域来存储各种类型的数据,这些...

    java 内存中 堆、栈、常量池、方法区的总结

    在Java内存管理中,堆(Heap)、栈(Stack)、常量池(Constant Pool)和方法区(Method Area)是四个核心概念,它们在Java程序运行时扮演着不同的角色。 首先,方法区是用来存放类的信息、常量、静态变量等数据的...

    java堆、栈和常量池

    ### Java堆、栈和常量池详解 #### 一、Java内存模型概述 Java程序运行时,内存可以分为几个不同的区域: 1. **寄存器**:这部分内存由硬件直接支持,程序无法直接控制。 2. **栈**:用于存储基本类型的数据和对象...

    Java中的堆、栈和常量池_.docx

    在Java中,内存被划分为几个不同的区域,包括堆、栈、常量池和寄存器等。下面我们将详细讨论这些概念。 1. 寄存器: 寄存器是计算机硬件的一部分,用于快速访问数据。在Java中,寄存器由编译器根据需要自动分配和...

    java堆-栈-堆栈常量池的区别,史上最全总结

    总结来说,Java的堆和栈分别服务于不同类型的变量和对象,而常量池则提供了一种优化内存使用的方法。理解这些概念对于编写高效且内存友好的Java代码至关重要。在实际编程中,合理地利用栈、堆和常量池可以帮助我们更...

    关于Java栈与堆的思考

    关于Java栈与堆的深入解析 Java作为一种广泛使用的编程语言,其内存管理机制是学习者必须掌握的核心概念之一。在Java中,栈(Stack)与堆(Heap)是用于存储数据的主要区域,它们各自承担着不同的职责,对于理解...

    Java堆、栈和常量池

    Java编程语言中的内存管理是通过堆、栈和...总的来说,理解Java的堆、栈和常量池对于优化代码性能、避免内存泄漏以及正确地处理对象引用至关重要。掌握这些内存区域的工作原理能帮助开发者写出更高效、更稳定的代码。

    Java 中的堆和栈

    在Java中,内存主要分为两个区域:栈内存和堆内存。这两部分内存各自有不同的特点和用途。 首先,栈内存主要负责存储基础数据类型(如byte, short, int, long, float, double, boolean, char)和对象的引用。当在...

    深入堆与栈 堆与栈的区别

    通过对上述示例的分析,我们可以看出,理解堆和栈的概念对于Java程序员来说非常重要。栈主要用于存储基本类型的变量和对象的引用,而堆则用于存储所有对象实例的实际数据。此外,字符串常量池的概念也非常重要,它...

    Java String 字符串常量池解析

    了解字符串常量池的位置是非常重要的,字符串常量池存在于方法区中,而堆和栈是不同的存储区域。堆存储的是对象,每个对象都包含一个与之对应的 Class,JVM 只有一个堆区,被所有线程共享。栈每个线程包含一个栈区,...

    详解java堆和栈

    在Java编程中,理解堆(Heap)和栈(Stack)的概念及其区别对于程序员来说至关重要。本文将深入剖析这两个概念,并探讨它们之间的差异以及如何影响程序的运行。 #### 二、Java中的栈(Stack) Java中的栈主要用于...

    Java数据结构之栈与堆

    总的来说,理解Java中的栈和堆对于编写高效、无内存问题的代码至关重要。栈适用于存储临时且生命周期短的数据,而堆则适合那些需要长期存在或者大小不确定的对象。正确地利用这两种数据结构,可以优化程序性能并减少...

    Java栈详解Java栈详解.doc

    Java栈是Java虚拟机(JVM)内存模型的重要组成部分,主要负责存储方法调用过程中的局部变量、操作数和方法返回信息。栈的特点是后进先出...理解Java栈的工作原理对于优化代码性能、理解和排查内存相关问题至关重要。

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

    在Java编程语言中,理解栈(stack)和堆(heap)的概念及其工作原理对于深入掌握Java虚拟机(JVM)如何管理内存至关重要。栈和堆都是在RAM中用于存储数据的关键区域,但在功能、使用场景和管理机制上存在显著差异。 #### ...

    变量在Java栈、堆内存中的运用管理分析.pdf

    除了栈和堆,还有常量池、静态域和非RAM存储等。常量池用于存储常量和字符串字面量;静态域存储类的静态变量;非RAM存储通常指硬盘等持久化存储,用于保存程序运行时的某些数据。 理解变量在栈和堆内存中的管理对于...

    java中堆与栈的区别

    这是因为JVM优化了字符串常量池,避免重复创建相同的字符串对象。 - **使用 new 创建对象** ```java String str1 = new String("abc"); String str2 = new String("abc"); ``` 使用 `new` 关键字创建的字符...

Global site tag (gtag.js) - Google Analytics