标签:
1、GC分代假设绝大多数对象的生命周期都很短,存活时间短暂。因此GC算法首先关注的即是这些短命对象。对于负载不高的应用来说,也不会发生fullGC的现象。这点提醒我们,应尽可能使对象生命周期缩短。有些程序员会尽可能地减少new对象的次数,尝试减小堆的分配开销,减少内存碎片,但短命对象的创建在JVM中比我们想象的性能要好,而且对象创建的速率越高,那么GC也会越快被触发!因此,吝啬new的使用是个不明智的选择。
2、Java容器的一个特点就是可以动态扩展,所以通常我们都不会去考虑初始大小的设置,不够了反正会自动扩容呗。但是扩容不意味着没有代价,甚至是很高的代价。对于不断增长的结构来说,经过若干次扩容,会存在大量无用的老数组,而回收这些数组的压力,全都会加在GC身上。容器的扩容并不是等到容器满了才扩容,而是有一定的比例。在Google Guava框架中我们可以通过传入预估的大小,剩下的由Guava解决。
3、对于对象池,唯一合适的场景就是当池中的每个对象的创建开销很大时,缓存复用才有意义。即使你真的需要实现一个对象池,也请使用成熟的开源框架,例如Apache Commons Pool。另外,使用JDK的ThreadPoolExecutor作为线程池,不要重复造轮子。
标签:
原文地址:http://www.cnblogs.com/lzpadmin/p/4443131.html