`
ttitfly
  • 浏览: 623836 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

String的intern()

    博客分类:
  • java
阅读更多

(转http://www.blogjava.net/beike/archive/2006/08/10/62694.html)

关于 String的intern() 的用途 及简单测试

近来要加载许多数据库数据到内存,
这些数据有很多是重复的。
在反复测试之后
发现intern() 省了好多内存。

举例如下:

以下是表信息:
mysql> select count(*) from t1;
+----------+
| count(*)   |
+----------+
| 8000        |
+----------+
1 row in set (0.01 sec)

mysql> select name From t1 limit 0,1;
+--------------------------------------+
| name                                                  |
+--------------------------------------+
| 123456789123456789123456789    |
+--------------------------------------+
1 row in set (0.00 sec)

总共8000行 ,每行的数据都是 "123456789123456789123456789"


下面是类 (连接异常忽略)

public static void a1() throws SQLException {
  List<Po> list = new ArrayList<Po>();
  Connection con = DB.getCon();
  Statement stmt = con.createStatement();
  ResultSet rs = stmt.executeQuery("SELECT name FROM t1");

  while (rs.next()) {
    String s = rs.getString(1); 
  Po o = new Po();
   //o.setName(s); //注释掉
   o.setName(s.intern()); 
  list.add(o);
   s=null;
    o = null;
  }
rs.close();
  stmt.close();
  con.close();
 }


public static void a2() throws SQLException {
  List<Po> list = new ArrayList<Po>();
  Connection con = DB.getCon();
  Statement stmt = con.createStatement();
  ResultSet rs = stmt.executeQuery("SELECT name FROM t1");

  while (rs.next()) {
    String s = rs.getString(1); 
  Po o = new Po();
o.setName(s);
  list.add(o);
   s=null;
    o = null;
  }
rs.close();
  stmt.close();
  con.close();
 }


注意着色部分,
a1 方法测试 使用内存: 2046544
 a2 方法测试 使用内存: 3475000


如果在函数的结尾加上 System.gc();  去除connection 的影响

a1 方法测试 使用内存:   668856
 a2 方法测试 使用内存:2262232

然后再把 写函数 a3() ,把rs.getString(1) 换为 get()

static String get() {
  return "123456789123456789123456789123456789123456789";
 }

public static void a3() throws SQLException {
  List<Po> list = new ArrayList<Po>();
  Connection con = DB.getCon();
  Statement stmt = con.createStatement();
  ResultSet rs = stmt.executeQuery("SELECT name FROM t1");

  while (rs.next()) {
    String s = get(); 
  Po o = new Po();
o.setName(s);
  list.add(o);
   s=null;
    o = null;
  }
rs.close();
  stmt.close();
  con.close();
 }

a3 方法测试 使用内存:666536   
a2 (668856)比a3 的内存使用量多了一点点,这个估计就是常量池那一点内存

8000条数据 差别这么大, 数据量再大的话,优势更加明显.
建议大家在连接数据库查询出来的数据,用intern();
注:内存使用 用 Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory() 计算

都是不同的数据就没有必要了,
我这个测试是放大了 有了重复数据后 intern() 的影响
用不用视情况而定吧.

 


分享到:
评论

相关推荐

    String类的intern、split方法

    String类的intern、split方法 String 类的 intern 方法是一个本地方法,定义如下:public native String intern();该方法返回一个字符串对象的内部化引用,由 String 类维护一个初始为空的字符串的对象池,当 ...

    C#中字符串优化String.Intern、IsInterned详解

    C#中字符串优化String.Intern、IsInterned详解 C#中字符串优化是指在编程过程中对字符串进行优化,以减少内存占用和提高程序运行效率。在C#中,字符串是一种特殊的数据类型,它既是基元类型又是引用类型。在编译和...

    Ben.StringIntern:字符串缓存以合并重复的字符串; 限制了第二代LRU驱逐以及Gen2 GC集合的进一步驱逐

    受此问题的启发而被关闭:“ API请求:string.Intern(ReadOnlySpan ...)” 共享池已设置上限; 具有第二代LRU驱逐,以及第二代GC集合的进一步驱逐。 使用示例 馆藏 using Ben . Collections ; array = array . ...

    深入理解 Java String#intern() 内存模型.docx

    "深入理解 Java String#intern() 内存模型" Java String#intern() 内存模型是 Java 语言中一个重要的概念,.string#intern() 方法是 Java 字符串常量池中一个重要的组件。字符串常量池是一个固定大小的 HashMap,桶...

    关于java String中intern的深入讲解

    Java String 中 intern 的深入讲解 Java String 中的 intern 方法是一个非常重要的概念,它可以将字符串对象存储在字符串常量池中,以便重复使用相同的字符串对象,减少内存的占用。下面我们将深入讲解 Java String...

    深入理解JavaString#intern()内存模型Ja

    在Java编程语言中,`String`类是极其重要的,它提供了许多用于操作字符串的方法,其中之一便是`intern()`。深入理解`String#intern()`方法对于优化内存使用和理解Java的内存模型至关重要。`intern()`方法是一个非常...

    jdk1.8之后的String.intern()方法内存分析

    关于String.intern()方法,这个问题都被问烂了,有的文章在分析的时候还在用jdk1.7,jdk1.8之后内存模型发生了变化,内存的变化也会影响intern方法的执行,这里有必要写文章分析一下,请大家务必从头开始看,这样...

    string类的常用方法.pdf

    `String intern()` - **描述**: 返回字符串对象的规范化表示形式。 - **返回**: 字符串池中的字符串,如果当前字符串已经存在于池中,则返回同一个引用;否则返回当前字符串的一个规范化版本并将其添加到池中。 ##...

    JVM系列之String.intern的性能解析

    那么String.intern的性能怎么样呢?我们一起来看一下。 String.intern和G1字符串去重的区别 之前我们提到了,String.intern方法会返回字符串常量池中的字符串对象的引用。 而G1垃圾回收器的字符串去重的功能其实和...

    提高java代码性能各种技巧

    字符串池可以使用自己定义的 Map&lt;String, String&gt; 或者使用 JDK 提供的 String.intern() 方法实现。 Java 6 中的字符串池 在 Java 6 中,字符串池是存储在 PermGen 中的固定的内存区域中。PermGen 的大小是固定的...

    Java String的intern用法解析

    Java String的intern用法解析 Java String的intern方法是Java中一个非常重要的方法,它可以将字符串常量池中的字符串对象返回给我们。今天,我们将深入探究Java String的intern用法解析,了解它的工作原理和应用...

    不同jdk版本下对String的intern()的分析.pos

    pos文件是ProcessOn的源文件,可以导入后直接打开编辑。 内容是:不同jdk版本下对String的intern()的分析

    Java中关于String的全面解析

    Java中的String是一个非常重要的类,它提供了两种创建方式和一种特殊的存储机制(String intern pool),并且String类中声明了一个char[]数组和一个int类型的变量hash,用于存储字符串的内容和哈希值。

    JAVA面试题解惑系列合集.docx

    - **方法**:`String intern()`用于获取字符串池中的引用。 6. **总结**:通过`new String()`创建的字符串对象存储在堆中,而字符串字面量直接指向字符串池中的对象。字符串池中的对象只存储一次,可以被多个变量...

    java String的intern方法

    Java中的`String`类的`intern()`方法是一个非常有趣且重要的功能,它涉及到字符串的内存管理,特别是字符串常量池。常量池是Java虚拟机(JVM)的一部分,存储预编译的字符串字面量和其他常量。`intern()`方法的作用...

    mat工具测试类

    6. **使用Instance Filter和String Intern Pool**:过滤特定类型的实例,或者分析字符串常量池的内存占用。 通过以上步骤,开发者可以系统地进行内存测试和分析,从而提升Java应用的稳定性和效率。在实际开发中,...

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

    如果不是用双引号声明的String对象,可以使用String提供的intern方法。intern方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中。 在Java中,字符串常量池存在于方法区中。方法...

Global site tag (gtag.js) - Google Analytics