日志平台client面临着输出日志的问题。为了避免干扰业务系统,我们采用异步输出的方式。这实际上相当于一个多生产者-单消费者的多线程模型。传统的方式是使用同步加锁的方式,但是这种方式不够高效。之前 钟柱 分享过一个topic。当时没完全听懂。这次对这个问题再次研究了下。

传统lock低效的原因总结如下:

1 总的来说同步的目的有两个,保证写入的顺序;保证写入的东西被正确的读到;

2 lock的实现会导致虚拟机切换到系统内核状态,从系统内核挂起其他线程,直到lock被释放;切换很花时间;而且挂起其他线程也要花费时间;而且挂起后将会导致cache的失效;

3 如果不用lock,也可以使用CAS的方式实现对变量的独占访问。Cas是cpu提供的一种机器指令,不需要切换到内核状态。Java util下的哪些atomicXXX就是使用的这种方法。问题是使用这种方法难以实现复杂的同步机制。更重要的是,即使写成功了,还是要通知别的线程数据已经改变,以阻止他们读到错误的数据;

4 数据更改的通知是通过memory barrier来实现的。现代计算机的一个特点是,数据可能存在多个地方,register,processor的cache,内存里。各个processor的cache是独立。当一个变量发生修改时,需要通过一个消息协议,更新该变量的所有备份。在更新完成之前,所有的线程都必须等待;

5然后是处理器的缓存。大家知道cpu每次读内存都会将连续的若干字节读入到cache中。如果cpu顺序访问这些内存,那么cahce就会命中,就避免了读内存。但问题是如果读入cache的内存包含多个变量,并且分别被不同的线程修改,那么处理器必须多次进行memory读取的操作,从而降低了性能。由于同样的原因,使用array的性能高于使用linklist和tree的性能。

6 最后是队列的问题。队列的head,tail和size通常会读到cache中,然而,多个线程会同时修改它,导致竞争的发生。而且queue的底层使用linklist或者arraylist,会导致大量的gc的发生;

针对这些问题一帮人提出了Disruptor框架,可以极大的提高读写并发的性能。

jvm lock低性能分析的更多相关文章

  1. java面试-JDK自带的JVM 监控和性能分析工具用过哪些?

    一.JDK的命令行工具 1.jps(JVM Process Status Tools):虚拟机进程状况工具 jps -l 2.jinfo(Configuration Info for java):Ja ...

  2. JVM性能分析与优化

    JVM性能分析与优化: http://www.docin.com/p-757199232.html

  3. 【转】JVM虚拟性能分析

    JDK自带的JAVA性能分析工具.它已经在你的JDK bin目录里了,只要你使用的是JDK1.6 Update7之后的版本.点击一下jvisualvm.exe图标它就可以运行了. 这里是VisualV ...

  4. JVM性能分析工具详解--MAT等

    获得堆转储文件 巧妇难为无米之炊,我们首先需要获得一个堆转储文件.为了方便,本文采用的是 Sun JDK 6.通常来说,只要你设置了如下所示的 JVM 参数: -XX:+HeapDumpOnOutOf ...

  5. 性能分析神器VisualVM

    VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量数据.跟踪内存泄漏.监控垃圾回 ...

  6. 性能分析之-- JAVA Thread Dump 分析综述

    性能分析之-- JAVA Thread Dump 分析综述       一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...

  7. jstack(查看线程)、jmap(查看内存)和jstat(性能分析)

    公司内部同事分享的一篇文章 周末看到一个用jstack查看死锁的例子.昨天晚上总结了一下jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令.供大家参考 1.Jstack 1.1 ...

  8. jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令

    jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令   公司内部同事分享的一篇文章 周末看到一个用jstack查看死锁的例子.昨天晚上总结了一下jstack(查看线程).jma ...

  9. 命令:jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令

    命令:jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令 这些命令 必须 在 linux jdk bin 路径 下执行 eq: ./jstack 10303 即可  如果想把 ...

随机推荐

  1. TZOJ 4855 排座椅(贪心)

    描述 上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来后,只有有限的D对同学上课时会交头接耳.同学们在教室 ...

  2. C++重载、重写(覆盖)、隐藏

    类成员函数中重载/重写(覆盖)/重定义(隐藏)的区别? 答:分别简单讲述一下函数重载,函数覆盖,函数隐藏的概念与特征: 函数重载:重载函数通常用来命名一组功能相似的函数 1.函数要在相同的类域 2.函 ...

  3. swift - 网络请求数据处理 - 协议处理

    1. 在类的模型之中或类的结构体 里面 实现下面方法 /// 添加预约数据源模型 - rootModel class DataModelForAddNewBespeakModel: NSObject ...

  4. DataTable学习笔记---排序细则、列隐藏

    耽误了好几天,因为要做一个嵌入式的实验-android内核编译与裁剪,很久之前装的wubi不知道为什么运行出错了,然后看着当前的win7系统觉得有点讨厌了,也是因为快1年半没装机了,所以就重新装机了, ...

  5. Halcon中数据的四舍五入、取整、有效数字以及和字符串之间的转换

    *此代码可直接复制到HDevelop中运行 a:= 3.456 *取整.取最近的整数 int_a := int(a) //取整数部分,结果是3 round_a := round(a) //将输入元组转 ...

  6. 纯净版Windows7系统迅雷下载路径

    windows 7 旗舰版64位------------------- Windows 7 Ultimate (x64) - DVD (Chinese-Simplified) 详细信息 文件名     ...

  7. @RequestMapping 介绍

    RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. RequestMapping注解有六个属性,下面我们把她 ...

  8. geoserver 文件系统

    我介绍了GeoServer的一些重要的资源以及它们的访问接口,现在来看看它们的保存形式.GeoServer的数据没有保存到数据库,而是文件系统,这让我们的学习轻松不少.默认情况下,GeoServer的 ...

  9. UI设计是青春饭?今天告诉你真相!

    最近有学员来问,“我想转行学习UI设计,但是听很多人说,UI设计是吃青春饭的,互联网公司是不是只选择年轻的血液而淘汰年纪大的?”今天,我来统一回答一下. UI设计是不是青春饭? 我们先来思考一个问题: ...

  10. tp5.1注册路由后接收不到参数