高并发下的内存管理技巧

  1、为何高并发下容易oom

    1)首先我们了解当执行垃圾回收的时候,会导致进程暂停,从而使我们的程序卡死;进程长时间暂停,又会导致大量的请求积压等待处理,垃圾回收刚刚结束,更多的请求立刻涌进来,迅速占满内存,再次被迫执行垃圾回收,进入了一个恶性循环。如果垃圾回收的速度跟不上创建对象的速度,还可能会产生内存溢出的现象。

  所以说往往在高并发的情况下更容易发生oom。

    2)除此之外垃圾回收算法产生内存碎片也会产生影响。内存碎片在GC执行标记-清除算法时产生,当完成对象的回收后,会需要再整理内存碎片,将不连续的空闲内存移动到一起,以便空出足够的连续内存空间供后续使用。和垃圾回收算法一样,内存碎片整理也有很多非常复杂的实现方法,但由于整理过程中需要移动内存中的数据,也都不可避免地需要暂停进程。

    内存碎片举例来说:内存中有10个字节,初始化了5个short类型的对象,每个short占2字节,程序运行一段时间后,有两个short使用后被回收了,此时有想新建一个int,这时可能是不成功的,

因为回收掉的两个short可能不是连续的,但是创建int必须是连续的4个字节,所以就产生了占用空间的内存碎片。

  2、高并发下的内存管理技巧

    1)尽量少的创建对象,优化业务处理逻辑,特别是占用内存大的对象。例如:我们可以把收到请求的 Request 对象在业务流程中一直传递下去,而不是每执行一个步骤,就创建一个内容和 Request 对象差不多的新对象。

    2)考虑自行回收并重用对象。建立一个对象池。收到请求后,在对象池内申请一个对象,使用完后再放回到对象池中,这样就可以反复地重用这些对象,非常有效地避免频繁触发垃圾回收。

    3)尽可能使用内存大的服务器

  

  

posted @ 2020-02-13 22:14  以梦为码  阅读(574)  评论(0编辑  收藏  举报