快捷搜索:

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

内存(条)是便宜,很不幸,垃圾收受接收机制导致的停息会严重影响系统机能,似乎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下,一清二楚,如附件图:

设置设置设备摆设摆设恰当的缓存Cache策略来办理GC问题也相称紧张,我们提倡基于内存的领域工具编程,大年夜量数据都在缓存中in-memory,若何包管他们的生命周期和JVM的垃圾收受接收机制不冲突,也是一种实际问题,文章提出下面几点:

1.为缓存增添掉效期,让新生代的GC时代要擅长缓存的掉效期,也便是缓存中工具数据掉效后,恰恰GC启动后可以收受接收这些掉效工具。

2.增添延长新生代的GC时代。

3.在缓存中应用弱引用。缓存产品自己的事,和我们利用者无关。

4.增添缓存大年夜小,我小我履历尽可能将数据库数据以领域工具要领都加载到内存中。

JVM首先分配所有对在新生代,然后将幸存工具(一样平常是缓存中工具)再分配到旧生代,或再分配到新生代,这些工具的拷贝将消费光阴导致新生代网络停息,两种选择:

1.在第一次网络时,就将工具复制到旧生代

2.第二次网络时,将工具复制到旧生代。

第一种法子将导致一些短生命周期工具复制到旧生代,第二种法子必要留意新生代垃圾网络的频度和永生命周期工具是否小。

对付一个伟大年夜的heap,新生代垃圾网络停息主如果在空间扫描和复制幸存工具上,在新生代大年夜小上必要取得一个平衡,旧生代大年夜小足够放入利用的数据,比如JiveJdon一世界来缓存的大年夜小是200K阁下(天天启动的环境下),只要旧生代大年夜小大年夜于这个值即可,不能太大年夜,也不能太小。

增添新生代大年夜小要增添全部JVM大年夜小,否则就会低落旧生代的内存大年夜小。

可以设置设置设备摆设摆设CMS短期停息:–XX:CMSWaitDuration –设置网络停息的最大年夜距离光阴,越大年夜你的利用将被停息,类似逝世机没有反映。XX:+CMSScavengeBeforeRemark 可以避免在网络时代同时扫描。

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

针对不合利用特征进行算法设置设置设备摆设摆设,在线事务处置惩罚将消费相应光阴,而批处置惩罚将孕育发生大年夜量垃圾,这些都要用不合JVM来处置惩罚。

您可能还会对下面的文章感兴趣: