`
ZangXT
  • 浏览: 118017 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

小例子:如何说明String常量池的位置

阅读更多

    以前批过《关于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运行的内存比较好,稍小点就能验证。

12
0
分享到:
评论
6 楼 supertangcugu 2017-07-13  
senninha 写道
然鹅。。jdk1.8已经把这货移到了heap区?
只有把-Xmx调到很小才会出现heap overflow....

确实,jdk8的jvm模型已经变了
5 楼 senninha 2017-05-09  
然鹅。。jdk1.8已经把这货移到了heap区?
只有把-Xmx调到很小才会出现heap overflow....
4 楼 onada1108 2017-03-27  
还有你是基于jdk那个版本
3 楼 onada1108 2017-03-27  
我想问下,你这个方法跑啦多长时间
2 楼 chembo 2015-11-06  
1 楼 francis.xjl 2010-11-19  
不错~这个方法赞~

相关推荐

    String int 字符串常量池 包装类型 函数参数 值传递引用传递 的 内存分配例子——源码

    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=...

    深入理解JVM实战篇-String类1

    在上述例子中,s1直接从常量池获取引用,而s2则在堆上创建了一个新的String对象。这里的关键点是,即使字符串内容相同,s1和s2也是不同的对象,因此`s1 == s2`的结果为false。 接下来,我们来看String的intern()...

    String方法使用例子

    - 字符串字面量:如`"Hello"`,这种创建方式是在常量池中创建字符串。 2. **比较字符串** - `equals()`:比较两个字符串的内容是否相等,忽略大小写可使用`equalsIgnoreCase()`。 - `compareTo()`:基于Unicode...

    string中的常见问题

    在这个例子中,`a` 和 `b` 都是直接赋值的字符串,因此它们都会存储在字符串常量池中。由于 `"a" + "b"` 会在编译期间被优化为 `"ab"`,所以实际上 `b` 也指向了 `"ab"` 这个字符串,因此 `a == b` 的结果为 `true`...

    String对象创建问题

    在上述代码中,`s1`和`s2`引用的是常量池中的同一个`String`对象,因为它们的值相同。这种优化被称为字面量共享,可以节省内存。 然后,我们来看执行期的`String`对象创建,这通常涉及`new`关键字。当使用`new ...

    String对象的内存分析

    本篇文章将深入探讨`String`对象的内存分析,包括栈、堆、常量池以及静态存储的概念,并通过具体的示例来解析不同情况下`String`对象的创建和内存分配。 首先,了解Java内存的基本结构。Java内存分为以下几个区域:...

    对String的深入理解

    `时,s只是一个指向字符串常量池中"abc"对象的引用,而不是实际的对象。对象则通常通过`new`关键字在堆内存中创建。 2. 字符串文字池(文字池/常量池): Java为了优化内存使用和提高性能,将所有的字符串文字...

    Java程序设计基础:String类的常用方法(二.pptx

    - **解释**:`str1` 和 `str2` 因为是在同一个常量池中创建的,所以它们指向同一个对象,因此返回 `true`。而 `str3` 是通过 `new` 关键字创建的新对象,尽管内容相同,但不是同一个对象,所以返回 `false`。 ####...

    String类创建对象问题

    #### 一、String 类与常量池、字符串池的基本概念 在 Java 中,`String` 类并不属于八种基本数据类型之一,而是作为一个对象存在。这意味着 `String` 对象默认值为 `null`。尽管如此,`String` 类拥有其独特之处,...

    String类详解!

    2. **内存分配差异**:简化语法实际上利用了Java的字符串常量池机制,使得相同的字符串仅被创建一次并存储于常量池中,从而节省了内存资源。相比之下,使用`new String()`会额外创建一个对象实例,这可能导致内存...

    string 的创建

    以上代码说明 `str1` 和 `str2` 都指向了字符串常量池中的同一份 `"abc"`。 2. **修改直接赋值创建的字符串变量**: ```java String str1 = "abc"; String str2 = "abc"; str1 = "bcd"; System.out.println...

    有关Java String常用方法的总结.docx

    在这个文档中,我们主要讨论了关于Java String类的一些常用方法以及与String相关的常量池问题。 首先,我们要理解Java中的final关键字。当final修饰一个引用变量时,它确保这个引用变量一旦被初始化,就不能再指向...

    字节码解析示例与说明解析

    本文将深入探讨字节码的概念,通过具体的示例和常量池的解析来阐述其工作原理。 首先,我们需要理解什么是字节码。字节码是一种中间表示形式,它是Java源代码编译后的产物,存储在.class文件中。每个字节码指令都是...

    String字符串比较1

    Java中的字符串操作是一个...了解字符串的存储位置(常量池或堆),以及如何通过`==`和`.equals()`比较字符串,以及`intern()`方法的作用,可以帮助开发者避免不必要的性能开销,并写出更符合Java内存管理原则的代码。

    String类型两种不同实例化方式

    1. **内存位置**:字面量方式创建的字符串存储在方法区的字符串常量池中,而new关键字方式创建的字符串则存储在堆内存中。 2. **性能**:字面量方式通常更高效,因为它利用了字符串缓存机制,避免了不必要的对象...

    String与StringBuffer区别详解

    这是因为`String`对象存在于常量池中,修改操作实际上是在常量池中创建新的引用,而不是修改原有的对象。 - `StringBuffer`(或`StringBuilder`)则提供了可变性,可以在已有内容的基础上进行修改,而无需每次都...

    Java常用类与基础API-String的理解与不可变性

    在JDK 8中,字符串常量存储在永久代(Permanent Generation)中的字符串池(String Pool)中。字符串池是一个特殊的内存区域,用于存储共享的字符串字面量,这有助于避免重复创建相同的字符串对象。 ```java // 示例...

Global site tag (gtag.js) - Google Analytics