文档章节

Twitter工程师谈JVM调优

lee123lee
 lee123lee
发布于 2016/09/19 09:36
字数 1159
阅读 41
收藏 1

一. 调优需要关注的几个方面

  1. 内存调优
  2. CPU使用调优
  3. 锁竞争调优
  4. I/O调优

二.Twitter最大的敌人 : 延迟

导致延迟的几个原因?

    最大影响是GC,  其他的有 : 锁和线程调度  、 I/O 、算法数据结构选取不当效率低

三. 内存性能调优

  1. 内存占用调优

OutOfMemoryError异常原因: 可能真的数据量太大、可能要数据显示的太多、可能内存泄漏。

数据量太大观察及解决

    查看GC日志,看 Full GC 前后内存变化,变化不大说明确实数据量太大

    尝试增加JVM内存使用

    考虑这些数据是否真的需要都在内存中?可以考虑使用 LRU算法换入换出等、弱引用(Soft References)

数据臃肿(Fat data):

    当你想做一些奇怪的事情时候会发生数据占用太大的问题,比如:把整个社交图谱加载到单个JVM实例上、加载全部用户的元数据到单个JVM实例上。

    在大规模的下的应用里较少这种内部数据呈现工作场景。

     数据臃肿原因:

  • 对象头(JVM对象头一半占用两个机器码,在32-bit JVM上占用64bit,在64-bitJVM上占用128bit即16 bytes,例如 new java.lang.Object()占用16 bytes; new byte[0]占用24 bytes。
  • 填充补全

            看个例子

public static class D{
    byte d1;
}
public static class E extends D{
    byte e1;
}

            new D()占用24bytes空间 ,new E() z占用32bytes空间。

    现在一般的是 64-bit的JVM,64-bit的指针会导致CPU缓存相比32-bit指针减少很多,所以建议 JVM 参数加入 -XX:UserCompressedOops采用指针压缩讲64-bit指针压缩为32-bit,但却又能使用64-bit的内存空间,达到一举两得的作用。另外,建议最大堆 小于 30G。

尽量别使用原始类型对象的包装类

在 Scala 2.7.7 中: Seq[Int] 存 Integer  Arraay[Int] 存 int , 第一个空间占用(24+32*length) bytes,第二空间占用(24+4*length)bytes。

在 Scala 2.8中修复了这个问题:我们可以看出:

    你不清楚你所用的雷哭的性能特征(比如能用int就用int)

    除非在性能分析工具下运行,否则你可能永远不知道这个问题 Map 空间占用(Map footprints)

    Guava MapMarker.makeMap()占用 2272 bytes,

    MapMaker.concurrencyLevel(1).makeMap() 占用 352 bytes

小心使用ThreadLocal

    典型的问题:在线程池 m*n 的资源相关,如200线程使用了50个连接,最终有1000个连接缓存

考虑使用同步对象活着每次创建一个对象

 

四. 与延迟做斗争

性能三角

图1、内存占用下降,延迟下降,吞吐量上升

图2、压缩(Compactness,即减小内存占用)率上身,吞吐量上升,响应速度上升

新生代是如何工作的?

    所有的新对象分配在Eden代,因为新生代 GC 有压缩,所用内存分配用指针碰撞

    当 Eden 满的时候,进行一次 stop-the-world 的 Minor GC,存活下来的对象存放到 Survivor

    经过几次 Minor GC,还存活的对象会被提升 (tenured)到老年代

从新生代开始调优

    打印详细 GC 日志,如开启 JVM 参数:

        -XX:+PrintGCDetails

        -XX:+PrintGCDateStamps

        -XX:+PrintHeapAtGC

        -XX:+PrintTenuringDistribution

        等等...

    关注 Survivor 大小,设置合适的 Survivor 大小

    关注提升阈值,使长期存活对象快速提升到老年代

    1)、-XX:+PrintHeapAtGC

    2)、-XX:+PrintTenuringDistribution

CMS调优

        CMS 收集器需要更多的内存,尽量多分配就对了

        减少碎片、避免 Full GC

        -XX:CMSInitiatingOccupancyFraction=n n一般设置为 75-80 (太早启动降低吞吐量,太晚启动导致 concurrent mode failed)

   

响应速速还是太慢?

        Minor GC 时有太多存活对象,尝试减少新生代空间,减少 Survivor 空间,减少晋升阈值

        太多线程。尝试找到最小的并发层次或者增加更多的JVM实例

        尝试使用 volatie 而不是 synchronized 减少锁竞争,尝试使用 Atomic* 的原子类

用分配 slab 应对 CMS 碎片问题

    Apahce 的 Cassandra 内部使用 slab分配。每个 slab大小为 2MB,使用 CAS 复制 byte[] 到里面,使用 Cassandra 前开销为 30~60 s/h,使用后在 3天零10小时 开销为 5s/h。

注意:使用分配 slab 的方式有一些局限性:在缓存满的时候才把缓存内容写进磁盘,而且对象需要转化为二进制等问题。

© 著作权归作者所有

lee123lee
粉丝 53
博文 144
码字总数 122159
作品 1
闵行
高级程序员
私信 提问
JavaOne 2016 —— 首日亮点

今年,为期5天的JavaOne会议中,4个会场的议题都进行了直播,演讲稿也在播出之后一并提供。来自Terracotta公司EHCache团队的Henri Tremblay,做了主题为 《学习Java 8:Lambda表达式和函数式...

两味真火
2016/10/01
1K
3
【北京】大型互联网公司招聘高级java开发工程师(结算&财务系统)【猎头招聘】

高级java开发工程师(结算&财务系统) 一淘-广告技术 北京 工作年限 3年以上 学历要求 本科 岗位描述 1. 和产品经理一起讨论需求,并对需求进行分析、设计和开发工作; 2. 核心代码编写、指导...

melody123
2012/05/15
813
4
论Java程序猿的自我价值提升,BATJ资深架构体系助你飞跃瓶颈区!

Java那句广为人知的口号“一次编写,处处运行”也体现出Java价值的关键所在—强大的Java虚拟机使得Java具有跨平台兼容性。 目前流行的Java职业路径包括后端开发员、大数据开发员,嵌入式系统...

Java填坑之路
2018/10/30
0
0
《成神之路-基础篇》JVM——JVM参数及调优(已完结)

Java内存模型,Java内存管理,Java堆和栈,垃圾回收 本文是[《成神之路系列文章》][1]的第一篇,主要是关于JVM的一些介绍。 持续更新中 JVM参数及调优 JVM实用参数系列 成为Java GC专家(5)...

2018/05/05
0
0
阿里P8级架构师:推荐高薪架构学习路线

前言: 陈磊,之前在一线名企工作多年,级别P8, 是企业的核心技术开发人员,目前有十三年的开发经验。从事于Java后端开发,对分布式架构、spring微服务、MySQL、框架、Netty、JVM、性能优化、...

别打我会飞
2018/11/26
205
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
4
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
5
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部