java 内存移到堆外!!! Jvm gcih 淘宝优化JVM实践

标签: java 内存 jvm | 发表时间:2014-05-01 00:54 | 作者:kkgbn
出处:http://blog.csdn.net

官方地址

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进程共享一份数据,有效降低了物理内存的使用。 


官方地址


官方地址

官方地址

作者:kkgbn 发表于2014-4-30 16:54:51 原文链接
阅读:71 评论:0 查看评论

相关 [java 内存 jvm] 推荐:

java 内存移到堆外!!! Jvm gcih 淘宝优化JVM实践

- - CSDN博客互联网推荐文章
出自Jvm  GC-Invisible Heap. GC-Invisible Heap,简称GCIH,是一种将Java对象从Java堆内移动到堆外,并且可以在JVM间共享这些对象的技术. GCIH顾名思义就是GC访问不到的堆,它是对JVM内存管理机制的一个有益的补充. 在某些特殊的应用中有大量生命周期很长的对象,在应用运行的整个过程中它们都存在,不需要被GC回收.

Java虚拟机(JVM)中的内存设置详解及优化

- - Java - 编程语言 - ITeye博客
JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制. 32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制. 我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m.

一步步优化JVM四:决定Java堆的大小以及内存占用

- - CSDN博客推荐文章
   到目前为止,还没有做明确的优化工作. 只是做了初始化选择工作,比如说:JVM部署模型、JVM运行环境、收集哪些垃圾回收器的信息以及需要遵守垃圾回收原则. 这一步将介绍如何评估应用需要的内存大小以及Java堆大小. 首先需要判断出应用存活的数据的大小,存活数据的大小是决定配置应用需要的Java堆大小的重要条件,也能够决定是否需要重新审视一下应用的内存需求或者修改应用程序以满足内存需求.

JVM内存分配

- - 移动开发 - ITeye博客
计算机内存,它算是CPU与计算机打交道最频繁的区域,所有数据都是先经过硬盘至内存,然后由CPU再从内存中获取数据进行处理,又将数据保存到内存,通过分页或分片技术将内存中的数据再flush至硬盘. 那JVM的内存结构到底是如何呢. JVM做为一个运行在操作系统上,但又独立于os运行的平台,它的内存至少应该包括象寄存器、堆栈等区域.

java 8 JVM性能优化

- - Java - 编程语言 - ITeye博客
转自:http://qindongliang.iteye.com/blog/2199633. jvm java 垃圾回收 . JVM是JAVA世界的核心,了解它有助于我们更好调试,调优和开发程序,最近散仙在看JAVA特种兵一书,看完觉得,作者写的内容还是挺不错,大家感兴趣的,也可以购买本温故而知新下.

java中JVM的原理

- - CSDN博客编程语言推荐文章
一、java虚拟机的生命周期:.   Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序. 程序开始执行时他才运行,程序结束时他就停止. 你在同一台机器上运行三个程序,就会有三个运行中的Java虚拟机. Java虚拟机总是开始于一个main()方法,这个方法必须是公有、返回void、直接受一个字符串数组.

jvm内存映像分析

- - ITeye博客
     jdk自带的jmap就是java内存映像工具,可以用于上生成堆转储快照:. 在eclipse中启动一个java类,打开jdk安装目录下的C:\Program Files\Java\jdk1.6.0_11\bin目录,双击jconsole.exe,显示连接窗口:.  ,单击pid为6920的选项,点连接进入,可以看到jvm运行时的多种参数,.

JVM内存的调优

- - ITeye博客
默认的 java 虚拟机的大小比较小,在对大数据进行处理时 java 就会报错: java.lang.OutOfMemoryError. 设置 jvm 内存的方法,对于单独的 .class ,可以用下面的方法对 Test 运行时的 jvm 内存进行设置. -Xms 是设置内存初始化的大小. -Xmx 是设置最大能够使用内存的大小(最好不要超过物理内存大小).

MAT JVM内存分析

- - 开源软件 - ITeye博客
我们使用的是 Eclipse Memory Analyzer V0.8,Sun JDK 6. 和其他插件的安装非常类似,MAT 支持两种安装方式,一种是“单机版“的,也就是说用户不必安装 Eclipse IDE 环境,MAT 作为一个独立的 Eclipse RCP 应用运行;另一种是”集成版“的,也就是说 MAT 也可以作为 Eclipse IDE 的一部分,和现有的开发平台集成.

[译] HotSpot JVM 内存管理

- - IT瘾-dev
HotSpot JVM 内存管理. 更新时间:2018-03-28. 关于 JVM 内存管理或者说垃圾收集,大家可能看过很多的文章了,笔者准备给大家总结下. 这算是系列的第一篇,接下来一段时间会持续更新. 本文主要是翻译《 Memory Management in the Java HotSpot Virtual Machine》白皮书的前四章内容,这是 2006 的老文章了,当年发布这篇文章的还是 Sun Microsystems,以后应该会越来越少人记得这家曾经无比伟大的公司了.