• 静思
  • 吴言片语
    • 吴言
    • 片语
    • 杂七杂八
  • 死于青春
    • 一路走好
  • 乌合麒麟
  • 纪念
    • 5.12
    • 3.23
  • GitHub
    • A List of Post-mortems
    • The Art of Command Line
  • 关于
    • Privacy Policy

程序员的信仰

金鳞岂是池中物,一遇风云便化龙

HOME » 技术生活 » 慎用LinkedXxxx集合

慎用LinkedXxxx集合

2009 年 3 月 5 日 @ 下午 4:58 by Jay | 被踩了 4,304 脚

这两天发现项目中有个模块有内存泄露,512 MB的堆内存大概在5个小时左右被耗尽。通过NB的profiler跟踪可以看到如下结果:
profiler
java.util.concurrent.LinkedBlockingQueue.Node对象尽然占了一多半。在实时profile中发现即使限定了list的capacity并且在不断调用take方法(相当于remove)时,Node的alive object数量仍在不断增长(照理说在某个时间节点后alive object数量应该增长得很缓慢,因为take的Node对象会被GC)。将LinkedBlockingQueue换成ArrayBlockingQueue后问题解决。继而发现LinkedList有同样的问题,于是得出结论:

  1. LinkedXxxx集合的remove、take,甚至clear方法不会导致被挪出队列的node马上被标记为可GC,可能会经过一个很长的时间(generation数量相当大)
  2. 由1推测LinkedXxxx的实现可能有内存泄露,或者JVM的GC算法可能有缺陷
  3. 由1、2得出经验:在集合内容需要做频繁替换(不断add/remove或者put/take)且程序运行时间很长的情况下最好不要使用LinkedXxxx,应该用ArrayXxxx替代并且指定capacity

补:感谢blader的补充,这个问题果然是个bug:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6460501


-- EOF --

除非注明(如“转载”、“[zz]”等),本博文章皆为原创内容,转载时请注明: 「转载自程序员的信仰©」
本文链接地址:慎用LinkedXxxx集合

分享

  • 点击分享到 Facebook (在新窗口中打开) Facebook
  • 点击以分享到 X(在新窗口中打开) X
  • 更多
  • 点击分享到Reddit(在新窗口中打开) Reddit
  • 点击分享到Telegram(在新窗口中打开) Telegram
  • 点击以在 Mastodon 上共享(在新窗口中打开) Mastodon

赞过:

赞 正在加载……

相关

Today on history:

【2008】写在果子狸六岁 [zz]
【2007】下雪,元宵,倒春寒
Posted in: 技术生活 Tagged: java, tuning, 内存泄露
← Java RMI中的NoSuchObjectException
如何让Netbeans以英文模式启动 →

android (9) apple (20) augmentum (9) Beijing (21) bt (8) career (28) coding (38) firefox (10) google (36) hibernate (11) ibm (11) iphone (10) java (93) linux (16) m$ (26) mac (58) macos (27) nazca (9) olympics (8) oo (8) playstation (10) rip (8) Shanghai (39) spring (9) tips (45) tommy emmanuel (8) ubuntu (12) usa (23) windows (9) 北航 (17) 博客 (29) 吐槽 (8) 周末 (9) 和谐社会 (26) 小资 (11) 愤青 (40) 方言 (10) 朋友 (77) 歌词 (8) 烟酒不分家 (18) 爱国 (19) 爱情 (8) 犯二 (15) 破解 (8) 足球 (11)

烫手山芋

  • 再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~ - 被踩了 27,197 脚
  • 生活,就是一个期待跟着一个期待 - 被踩了 21,357 脚
  • 星巴克饮品缩写大全(Starbucks Drink ID Codes)[zz] - 被踩了 18,402 脚
  • 从一个全角冒号说一下我为什么不感冒iOS - 被踩了 14,303 脚
  • 有关Character.isLetter()和Character.isLetterOrDigit() - 被踩了 13,589 脚

刚拍的砖

  • leo 发表在《再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~》
  • 花 发表在《再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~》
  • 无名氏 发表在《从一个全角冒号说一下我为什么不感冒iOS》
  • Jay 发表在《Mac OS geek级问题》
  • Wei Wang 发表在《再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~》

随便看看

  • About save/persist, update/merge in JPA/Hibernate14 年 ago
  • Be Happy14 年 ago
  • Spring之经验教训(一)9 年 ago
  • 谁要WOW cd key?5 年 ago
  • 刚才收到的钓鱼邮件,大家小心!9 年 ago

文以类聚

光阴似箭

其他操作

  • 登录
  • 条目 feed
  • 评论 feed
  • WordPress.org

Copyright © 2025 程序员的信仰.

Jay's Omega WordPress Theme by Jay

 

正在加载评论...
 

    %d