`
ttitfly
  • 浏览: 616340 次
  • 性别: 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() 的影响
用不用视情况而定吧.

 


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics