技术开发 频道

如何驯服java GC导致暂停?使用16GiB

  【IT168 技术】内存(条)是便宜,很不幸,垃圾回收机制导致的暂停会严重影响系统性能,好像JVM内存最多支持2G,作者花费大量时间精力使用32G来提高系统性能,这篇是其心得。

  GC微调是非常和应用有关,该篇的目标要求是:使用10G更大Heaps和严格的响应时间(毫秒级别),(吞吐量和延迟性是一对矛盾,这次GC微调主要是追求低延迟)。作者项目特点是:

  1.Heap用于在内存中储存数据结构

  2.Heap大小超过10G

  3.请求时间要求更快

  4.事务是短的(几百毫秒) 一个事务可以包括几个请求

  5.内存中数据修改频率和面积低,不会一秒内修改整个10G内存,每秒更新10M即可。

  此处省略垃圾回收机制原理介绍.....

  总体来说,banq注:JVM分新生代和旧生代,新创建在新生代,通过新生代垃圾回收,如果不能被回收,将逐步转入旧生代,旧生代内存可以实现缓存In-memeory数据,显然新旧两代的垃圾回收算法最好不一样,新生代需要频繁,而旧生代不需要频繁,如果我们内存缓存控制得好,旧生代就不会启动垃圾回收机制,这样就不会导致系统暂停。

  该文介绍如何来进行新生代大小调节,防止垃圾回收机制频繁启动,先使用XX:MaxNewSize= -XX:NewSize= 指定新生代大小,使用-XX:+PrintGCDetails -XX:+PrintTenuringDistribution -XX:+PrintGCTimestamps)输出GC诊断结果。

  有几个数据需要计算一下:

  新生代收集期间值,整个分配情况,短生命对象的分配大小,长生命对象的分配情况,中等生命对象分配。

  我个人更喜欢使用psi-Probe安装在tomcat下,一目了然,如附件图:

  原文还提到CMS(Concurrent Mark Sweep)激活会导致暂停等等。

  针对不同应用特点进行算法配置,在线事务处理将耗费响应时间,而批处理将产生大量垃圾,这些都要用不同JVM来处理。

0
相关文章