论坛首页 Java企业应用论坛

优化变成了忧患:String类的split方法引起的内存泄漏

浏览 53056 次
该帖已经被评为精华帖
作者 正文
   发表时间:2010-04-21  
确实是native的,效果相当于弱引用,没引用后内存可以回收的。
也许用native是为了性能考虑?不过没看出能有太大改进。哪位看出来的可以讲讲。
0 请登录后投票
   发表时间:2010-04-21  
miaow 写道
String.intern()就再也放不掉了,多数场景下恐怕更危险。

HotSpot里的话JVM的字符串池的实现是StringTable,继承自HashTable,其中有这么个东西:
class StringTable : public Hashtable {
  // ...
private:
  // The string table
  static StringTable* _the_table;

  // ...

  // Table size
  enum {
    string_table_size = 1009
  };
  
  // ...

public:
  // The string table
  static StringTable* the_table() { return _the_table; }

  // ...
  
  // GC support
  //   Delete pointers to otherwise-unreachable objects.
  static void unlink(BoolObjectClosure* cl) {
    the_table()->Hashtable::unlink(cl);
  }
  
  // ...
};

// GC support

void Hashtable::unlink(BoolObjectClosure* is_alive) {
  // Readers of the table are unlocked, so we should only be removing
  // entries at a safepoint.
  assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
  for (int i = 0; i < table_size(); ++i) {
    for (HashtableEntry** p = bucket_addr(i); *p != NULL; ) {
      HashtableEntry* entry = *p;
      if (entry->is_shared()) {
        break;
      }
      assert(entry->literal() != NULL, "just checking");
      if (is_alive->do_object_b(entry->literal())) {
        p = entry->next_addr();
      } else {
        *p = entry->next();
        free_entry(entry);
      }
    }
  }
}

StringTable里存的字符串也是可以释放的……只要StringTable以外没有任何地方能引用到它了
0 请登录后投票
   发表时间:2010-04-21  
to:RednaxelaFX
谢谢你的解答。
0 请登录后投票
   发表时间:2010-04-21  
感谢RednaxelaFX的解答,甚清楚。
0 请登录后投票
   发表时间:2010-04-21  
  以前总听别人说别用split方法,说是占内存,我一直都不明白为什么,今天终于明白了!
谢谢分享!
0 请登录后投票
   发表时间:2010-04-29  
HotSpot有C++的代码,还真的第一次知道啊,回头仔细看看
0 请登录后投票
   发表时间:2010-05-10  
jdk1.5有类似的问题吗?
0 请登录后投票
   发表时间:2010-07-09   最后修改:2010-07-09
精彩,看来领域不同精通的地方不同,我做这个领域该bug估计永远不会注意。
其实只要split切割完字符串后,直接使用,不要再缓存到内存中,这个bug可以认为是没有的,split还是最简单的分割字符串方法。
0 请登录后投票
   发表时间:2010-07-12  
以后用String 对象的subString方法时,需要谨慎了。
0 请登录后投票
   发表时间:2010-07-14  
jieyuan_cg 写道
抛出异常的爱 写道
miaow 写道
插个话:楼主怎么会传进一个几百K的字符串再切分的?觉得这场景很特别。

很有可能是这样的
爬虫把页面爬出来后
统计某些单词的使用频率

呵呵~~~~场景很贴切~

我现在写的爬虫就有内存泄露的问题 正在查 估计很大可能就是sting引起的。。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics