`
yangmeng_3331
  • 浏览: 91660 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Java中的栈,堆和常量池

    博客分类:
  • Java
阅读更多
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
  2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
  3. 堆:存放所有new出来的对象。
  4. 静态域:存放静态成员(static定义的)
  5. 常量池:存放字符串常量和基本类型常量(public static final)。
  6. 非RAM存储:硬盘等永久存储空间
  这里我们主要关心栈,堆和常量池,对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。
  对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
  如以下代码:
  Java代码
  String s1 = "china";
  String s2 = "china";
  String s3 = "china";
  String ss1 = new String("china");
  String ss2 = new String("china");
  String ss3 = new String("china");
  
  对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。
分享到:
评论
2 楼 yangmeng_3331 2011-12-13  
shiyiyue513 写道
文中有诸多不妥之处。

我是初学者,一直不太了解,这个找的感觉表达最清晰的一个,那里不妥能说一下吗
1 楼 shiyiyue513 2011-12-05  
文中有诸多不妥之处。

相关推荐

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

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

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

    - 字符串常量和基本类型的常量通常存储在常量池中。 - 在常量池中,对于字符串而言,如果两个字符串相等(通过`equals`方法比较),则在常量池中只保留一份拷贝。 #### 非RAM存储 非RAM存储指的是那些持久化的...

    Java堆,栈和常量池详解

    - 类加载过程中,会把.class文件中的常量池内容复制到方法区的常量池中。 - 方法区的内存回收主要针对常量池。 - **应用场景**: - 字符串字面量的存储。 - 方法、字段的符号引用。 #### 实例解析 下面通过几...

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

    在运行时,如果两个字符串的值相等,它们在常量池中可能只有一份拷贝,这是Java字符串常量池复用机制的体现。在Java 6及之前,字符串常量池位于永久代,从Java 7开始移到了堆中。 栈和堆之间的区别在于,栈中的数据...

    java堆、栈和常量池

    对于String常量,其值是直接存储在常量池中的。虚拟机为每个被加载的类型维护一个常量池,它是该类型所使用的常量的一个有序集合。 - **结构形式**:在JVM中,常量池是以表的形式存在的。对于String类型,有一张...

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

    但对象本身并不存放在栈上,而是存放在堆或者常量池中。栈中的数据生命周期较短,当没有引用指向它时,数据会被自动销毁。 3. 堆(Heap): 堆是Java内存模型的主要部分,用于存储所有通过new关键字创建的对象。堆...

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

    常量池中的字符串可以通过`intern()`方法实现引用共享。 4. 数据类型: Java中有两种数据类型:基本类型和引用类型。基本类型包括8种,它们的大小和生命周期是固定的,因此通常存储在栈中。例如,声明一个`int a = ...

    Java堆、栈和常量池详解

    易混点完美解析

    Java 中的堆和栈

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

    Java堆、栈和常量池

    `s1`、`s2`和`s3`都引用了常量池中的同一字符串对象,因为它们在编译时已知。而: ```java String ss1 = new String("china"); String ss2 = new String("china"); String ss3 = new String("china"); ``` 虽然它们...

    关于Java栈与堆的思考

    2. 在字符串常量池中查找是否存在值为"abc"的字符串,若不存在则创建一个新的`String`对象,并将字符串值"abc"放入常量池,若存在则直接返回该字符串的引用。 3. 将变量`str`指向这个`String`对象的引用。 这种方式...

    string常量池和intern_韩雅茹Java系列2021.pdf

    在Java中,字符串是不可变的,可以共享运行时实例创建的全局字符串常量池中。字符串常量池维护一个引用表,每个唯一的字符串对象都有一个对应的引用。这样,字符串常量池中的字符串不会被垃圾收集器回收。 字符串...

    Java数据结构之栈与堆

    ` 这样的创建方式实际上是将字符串字面量存储在常量池中,然后str引用这个字面量的位置,这种方式称为字符串常量池优化。而`String str = new String("abc");` 则会在堆中创建一个新的String对象。此外,JDK 5.0以后...

    详解java堆和栈

    1. **直接赋值**:如 `String str = "abc"`,此时会在字符串常量池中查找是否存在 `"abc"` 的字符串对象,如果不存在,则创建;如果存在,则直接使用。 2. **使用new关键字**:如 `String str = new String("abc")`...

    深入堆与栈 堆与栈的区别

    调用 `s1.intern()` 之后,`s1` 仍然指向堆上的对象,但它的内部引用指向了常量池中的相应对象。因此,`s0 == s1` 和 `s0 == s1.intern()` 的结果变为 `true`,而 `s0 == s2` 的结果同样为 `true`。 #### 三、总结 ...

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

    上述代码中的`str1`和`str2`都指向了同一个字符串对象,这是因为JVM在创建`str1`时,已经将字符串“abc”放入了常量池,当创建`str2`时,它会检查常量池中是否已存在“abc”,既然存在,就直接引用,而不是创建新的...

    java中的堆和栈

    `,这里创建了一个新的`String`对象,对象本身存储在堆中,而"abc"这个字符串字面值则可能存储在栈中或字符串常量池中。 #### 六、总结 了解Java中堆和栈的区别对于编写高效、健壮的Java程序至关重要。通过合理...

    Java String 字符串常量池解析

    它维护着一个表,总是为池中每个唯一的字符串对象维护一个引用,这意味着它们一直引用着字符串常量池中的对象,因此,在常量池中的这些字符串不会被垃圾收集器回收。 操作字符串常量池的方式有多种,例如使用 `...

    java里的堆和栈

    - 直接赋值创建的String对象如果不存在,则会放在字符串常量池中,位于方法区内;如果已经存在,则直接引用该字符串。 #### 七、总结 Java中的堆和栈是内存管理的基础,了解它们的区别有助于编写更高效、更安全的...

Global site tag (gtag.js) - Google Analytics