Re: [翻译] 死法无法预测

楼主: lovdkkkk (dk)   2014-04-27 07:33:01
有兴趣狗了一下找到一篇教怎么侦测跟处理的文章,
https://blogs.oracle.com/jrockit/entry/repost_tips_and_tricks_for_dealing_with_a_fragmented_java_heap
缩:http://ppt.cc/~D3m
简单摘要如下
推荐侦测工具:
JRockit Mission Control
Memory Leak Detector
1. Increase the heap size
这...有钱好办事 @@?
2. Use a generational GC
用不同的 GC 策略,用参数 -Xgc:gencon 或 -Xgc:genpar
3. Tune compaction parameters
调大 compaction ratio (e.g. -XXcompactratio=10) 早点做 defragment
4. Don't allocate memory
太神妙了,光看这句会让人觉得是在说什么屁话 0rz
请参考另一篇文章。
https://blogs.oracle.com/hirt/entry/unorthodox_uses_of_the_memory
缩:http://ppt.cc/SLjy
5. Avoid allocating large objects
少用 Array 等大型物件,(例如 ArrayList 可能改用 LinkedList?),
避免巨大的 String 也就是 char array (也改用 char linked list?)。
6. Allocate objects with similar lifespan in chunks
将一个操作要用到的资料在操作结束前都维持住不清,
让它们之后可以一口气同时被清掉,减少小的空洞。
※ 引述《AmosYang (Zzz...)》之铭言:
: ※ 引述《PsMonkey (痞子军团团长)》之铭言:
: : 在花了一天对付另一个 [Heisenbug]:每当我快抓到原因,它就会变了样;
: 闲聊瞎扯一下 :>
: 前几个月正好处理过一个类似的情形: 一个 multithreaded 的 .NET 程式不定时的
: 炸 OOM exception
: 对付陈宫,只能用箭;对付 Heisenbug, 除了 process dump analysis 外
: 大概没什么好办法
: 参考
: * http://blogs.msdn.com/b/dotnet/archive/2009/10/15/automatically-capturing-a-dump-when-a-process-crashes.aspx
: * http://blogs.msdn.com/b/pranavwagh/archive/2009/06/09/how-to-take-the-dump-for-a-process-which-crashes-randomly.aspx
: * http://technet.microsoft.com/en-us/sysinternals/dd996900.aspx
: * http://stackoverflow.com/questions/1134048/generating-net-crash-dumps-automatically
: * google jvm crash dump
: 通常来说, OOM 算是好解的问题,因为 OOM 多半来自 memory leak + loop
: 是故 heap 里多半会散布著大量相似的物件, 只要能辨认这些物件
: 通常反推回程式码里的问题点就没那么难
: 然而,有另一型的 OOM, 很久之前有稍微提过, 是属于 architectural 的问题,
: 就很难解 :( 因为 OutOfMemory 有时指的不是“内存的量不够”
: 而是“没有连续够大块的内存”
: 该案例里,就是大量地创造、释放大型物件 ( 大型物件会取在 .NET gen 2 heap ) 上
: 使得 gen 2 heap 的“连续可用空间”变得支离破碎,
: 而“可用空间总量”看起来还剩很多
: 打个比方,就像一立方公尺的木条跟一立方公尺的木屑都是一立方公尺的木料
: 但后者没办法拿来盖房子; 在这种情形下,不管是 .NET 还是 Java,
: 都只会炸 OOM, 不知道为什么不能设计成改炸 OutOfContinuousMemory 这种的...
: 最近几期的 MSDN 杂志里提到最新的 .NET GC 应该可以避免 fragmentation 发生
: 不知道最新的 Java 8 在这方面有没有相对应的改进
: 这种 OOM 就很难解…最快的解法就是装傻... :D
: 总结: 写 server 程式时,若能把该平台上的 debug 工具摸熟,常会有意想不到的妙用
楼主: lovdkkkk (dk)   2014-04-27 07:34:00
5:假如你有一些超大的东西,把它们拆小6:假如你同时要用一堆小东西,把它们装在一个大箱子
作者: AmosYang (泛用人型编码器)   2014-04-27 08:19:00
有趣的方向 :D
作者: bitlife (BIT一生)   2014-04-27 10:54:00
加一个 7.如果可能的话,死亡并让下个转世继续执行 XD
作者: Killercat (杀人猫™)   2014-04-27 12:53:00
8. 会造成破碎的部分改用daemon来写 用完就让它投胎

Links booklink

Contact Us: admin [ a t ] ucptt.com