以前批过《关于Java堆与栈的思考》这个帖子,具体内容见http://zangxt.iteye.com/blog/440330。
这里只是举个简单的例子说明字符串常量池在内存中的位置。
闲言少叙,直接上代码。
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
String str = "abc";
char[] array = {'a', 'b', 'c'};
String str2 = new String(array);
//使用intern()将str2字符串内容放入常量池
str2 = str2.intern();
//这个比较用来说明字符串字面常量和我们使用intern处理后的字符串是在同一个地方
System.out.println(str == str2);
//那好,下面我们就拼命的intern吧
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < 10000000; i++) {
String temp = String.valueOf(i).intern();
list.add(temp);
}
}
}
执行一下,会怎么样?
true
Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
at java.lang.String.intern(Native Method)
at Test.main(Test.java:16)
Java Result: 1
异常信息告诉我们PermGen 满了。奥,我知道字符串常量池在哪了。PermGen就是jvm规范中所谓的方法区。
这里偷懒了一下,只是指定了很大的数10000000让PermGen 溢出,不过时间可能长点。勤快的人还是自己指定java运行的内存比较好,稍小点就能验证。
分享到:
相关推荐
String int 字符串常量池 包装类型 函数参数 值传递引用传递 的 内存分配例子——源码 public static void fun_ref (Ref_test ref_out){ Ref_test ref_in=new Ref_test(); ref_in.s1="in"; //ref_out.s1=...
在上述例子中,s1直接从常量池获取引用,而s2则在堆上创建了一个新的String对象。这里的关键点是,即使字符串内容相同,s1和s2也是不同的对象,因此`s1 == s2`的结果为false。 接下来,我们来看String的intern()...
- 字符串字面量:如`"Hello"`,这种创建方式是在常量池中创建字符串。 2. **比较字符串** - `equals()`:比较两个字符串的内容是否相等,忽略大小写可使用`equalsIgnoreCase()`。 - `compareTo()`:基于Unicode...
在这个例子中,`a` 和 `b` 都是直接赋值的字符串,因此它们都会存储在字符串常量池中。由于 `"a" + "b"` 会在编译期间被优化为 `"ab"`,所以实际上 `b` 也指向了 `"ab"` 这个字符串,因此 `a == b` 的结果为 `true`...
在上述代码中,`s1`和`s2`引用的是常量池中的同一个`String`对象,因为它们的值相同。这种优化被称为字面量共享,可以节省内存。 然后,我们来看执行期的`String`对象创建,这通常涉及`new`关键字。当使用`new ...
本篇文章将深入探讨`String`对象的内存分析,包括栈、堆、常量池以及静态存储的概念,并通过具体的示例来解析不同情况下`String`对象的创建和内存分配。 首先,了解Java内存的基本结构。Java内存分为以下几个区域:...
`时,s只是一个指向字符串常量池中"abc"对象的引用,而不是实际的对象。对象则通常通过`new`关键字在堆内存中创建。 2. 字符串文字池(文字池/常量池): Java为了优化内存使用和提高性能,将所有的字符串文字...
- **解释**:`str1` 和 `str2` 因为是在同一个常量池中创建的,所以它们指向同一个对象,因此返回 `true`。而 `str3` 是通过 `new` 关键字创建的新对象,尽管内容相同,但不是同一个对象,所以返回 `false`。 ####...
#### 一、String 类与常量池、字符串池的基本概念 在 Java 中,`String` 类并不属于八种基本数据类型之一,而是作为一个对象存在。这意味着 `String` 对象默认值为 `null`。尽管如此,`String` 类拥有其独特之处,...
2. **内存分配差异**:简化语法实际上利用了Java的字符串常量池机制,使得相同的字符串仅被创建一次并存储于常量池中,从而节省了内存资源。相比之下,使用`new String()`会额外创建一个对象实例,这可能导致内存...
以上代码说明 `str1` 和 `str2` 都指向了字符串常量池中的同一份 `"abc"`。 2. **修改直接赋值创建的字符串变量**: ```java String str1 = "abc"; String str2 = "abc"; str1 = "bcd"; System.out.println...
在这个文档中,我们主要讨论了关于Java String类的一些常用方法以及与String相关的常量池问题。 首先,我们要理解Java中的final关键字。当final修饰一个引用变量时,它确保这个引用变量一旦被初始化,就不能再指向...
本文将深入探讨字节码的概念,通过具体的示例和常量池的解析来阐述其工作原理。 首先,我们需要理解什么是字节码。字节码是一种中间表示形式,它是Java源代码编译后的产物,存储在.class文件中。每个字节码指令都是...
Java中的字符串操作是一个...了解字符串的存储位置(常量池或堆),以及如何通过`==`和`.equals()`比较字符串,以及`intern()`方法的作用,可以帮助开发者避免不必要的性能开销,并写出更符合Java内存管理原则的代码。
1. **内存位置**:字面量方式创建的字符串存储在方法区的字符串常量池中,而new关键字方式创建的字符串则存储在堆内存中。 2. **性能**:字面量方式通常更高效,因为它利用了字符串缓存机制,避免了不必要的对象...
这是因为`String`对象存在于常量池中,修改操作实际上是在常量池中创建新的引用,而不是修改原有的对象。 - `StringBuffer`(或`StringBuilder`)则提供了可变性,可以在已有内容的基础上进行修改,而无需每次都...
在JDK 8中,字符串常量存储在永久代(Permanent Generation)中的字符串池(String Pool)中。字符串池是一个特殊的内存区域,用于存储共享的字符串字面量,这有助于避免重复创建相同的字符串对象。 ```java // 示例...