该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-21
确实是native的,效果相当于弱引用,没引用后内存可以回收的。
也许用native是为了性能考虑?不过没看出能有太大改进。哪位看出来的可以讲讲。 |
|
返回顶楼 | |
发表时间: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以外没有任何地方能引用到它了 |
|
返回顶楼 | |
发表时间:2010-04-21
to:RednaxelaFX
谢谢你的解答。 |
|
返回顶楼 | |
发表时间:2010-04-21
感谢RednaxelaFX的解答,甚清楚。
|
|
返回顶楼 | |
发表时间:2010-04-21
以前总听别人说别用split方法,说是占内存,我一直都不明白为什么,今天终于明白了!
谢谢分享! |
|
返回顶楼 | |
发表时间:2010-04-29
HotSpot有C++的代码,还真的第一次知道啊,回头仔细看看
|
|
返回顶楼 | |
发表时间:2010-05-10
jdk1.5有类似的问题吗?
|
|
返回顶楼 | |
发表时间:2010-07-09
最后修改:2010-07-09
精彩,看来领域不同精通的地方不同,我做这个领域该bug估计永远不会注意。
其实只要split切割完字符串后,直接使用,不要再缓存到内存中,这个bug可以认为是没有的,split还是最简单的分割字符串方法。 |
|
返回顶楼 | |
发表时间:2010-07-12
以后用String 对象的subString方法时,需要谨慎了。
|
|
返回顶楼 | |
发表时间:2010-07-14
jieyuan_cg 写道 抛出异常的爱 写道 miaow 写道 插个话:楼主怎么会传进一个几百K的字符串再切分的?觉得这场景很特别。
很有可能是这样的 爬虫把页面爬出来后 统计某些单词的使用频率 呵呵~~~~场景很贴切~ 我现在写的爬虫就有内存泄露的问题 正在查 估计很大可能就是sting引起的。。 |
|
返回顶楼 | |