java 内存移到堆外!!! Jvm gcih 淘宝优化JVM实践
时间:2014-05-01 17:39:58
收藏:0
阅读:320
Jvm gcih
出自Jvm GC-Invisible Heap
什么是GCIH
GC-Invisible Heap,简称GCIH,是一种将Java对象从Java堆内移动到堆外,并且可以在JVM间共享这些对象的技术。
为什么要用GCIH
GCIH顾名思义就是GC访问不到的堆,它是对JVM内存管理机制的一个有益的补充。 在某些特殊的应用中有大量生命周期很长的对象,在应用运行的整个过程中它们都存在,不需要被GC回收。如果这类对象很多,总体占用内存比例高,那么他们的存在将给GC带来很多不必要的工作负担。例如在淘宝的很多应用中都具有大量的Forest对象,目前这些对象已经占用超过400MB,它们本身在应用提供服务前创建,在服务过程中永远存在。那么实际在GC的收集工作中针对这些对象的所有访问、操作其实都是“无用功”。如果我们把这些对象 从Java堆内移动到堆外,那么这些对象所占用的Java堆内空间将被释放,GC的工作量将会降低,从而每次full GC的时间将会缩短。 除此以外,目前JVM间没有很高效的内存/对象共享技术,GCIH为在JVM间共享内存/对象提供了必要的基础。通过这种技术可以将那些移动到GCIH内对象在JVM间共享,从而减少内存的总体占用。
GCIH + Hesper + Forest线上测试结果对比
下面的性能测试数据来自于线上gcih + hesper + forest的实际压测数据,具体结论由淘宝性能测试团队统计。
- 系统load对比
在相同的tps下,采用gcih的hesper响应时间明显要比不采用gcih的hesper的响应时间要低。随着压力的不断增加,tps超过55后,非gcih的hesper响应时间明显上升速度加快,当tps上升至72后,响应时间直接飙至200ms以上。而采用gcih的响应时间上升速度则相对于平缓。
- 机器资源消耗对比
在tps处于20~50之间时,gcih的load要略低于非gcih。在tps超过55后,非gcih的load出现急速上升。 在tps相同的情况下,gcih的cpu消耗约降低20%~30%.
- 单机最大能力对比
当load达到5~6之间、且RT<200ms的情况下,hesper(非gcih)的tps约为46~55左右,hesper(gcih)的tps值约为60~68左右。此时,hesper(非gcih)的单机能力比hesper(gcih)提升20%; 当load<15,cpu使用率<85%的情况下,hesper(非gcih)的最大单机能力为tps:68~70,hesper(gcih)的tps值约为88左右。此时计算,采用gcih的hesper应用单机最大能力可提升25%。
- 综上:gcih的性能明显优于非gcih,可以使单机能力提升20%左右。
GCIH内存共享
有关GCIH内存共享
GCIH 内存共享有以下特点:
- 不经过JNI调用
- 没有序列化和反序列化
- GC性能提高
- 数据更集中,cache命中率提高
GCIH内存共享与Hadoop
- Map/Reduce 有时需要一些公用的对象,每个client JVM都有一份拷贝。
- 一旦初始化好,在使用过程中是只读的
- 对象比较大,占用较多内存,甚至成为瓶颈
- 一个实际场景,dump中心的UDP,用来做join的一些公共Hashmap共享后可以节约内存,甚至可能提高效率(如果内存是瓶颈)
下图显示了使用GCIH内存共享功能后的Hadoop系统状况,左边的图表示使用GCIH前系统内每个JVM进程内均有一份对象的拷贝, 右边的图显示使用GCIH后多个JVM进程共享一份数据,有效降低了物理内存的使用。
评论(0)