日志平台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. input限制数字输入

    onkeyup="this.value=this.value.replace(/\D/g,'')"

  2. spotlight

    spotlight - 必应词典 美['spɑt.laɪt]英['spɒt.laɪt] n.聚光灯:聚光灯照亮的地方:聚光灯照明圈:媒体和公众的注意 v.用聚光灯照:突出报道(以使公众注意) 网络射灯 ...

  3. MySQL基本操作之命令行操作

    MySQL基础操作 MySQL基础操作--命令行操作

  4. ROS学习笔记二(创建ROS软件包)

    catkin软件包的组成 一个软件包必须满足如下条件才能被称之为catkin软件包: 必须包含一个catkin编译文件package.xml(manifests文件),此文件包含了描述该软件包的重要信 ...

  5. VINS-mono详细解读

    VINS-mono详细解读 极品巧克力 前言 Vins-mono是香港科技大学开源的一个VIO算法,https://github.com/HKUST-Aerial-Robotics/VINS-Mono ...

  6. Spring框架的特点

    1. 为什么要学习Spring的框架 * 方便解耦,简化开发 * Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理 * AOP编程的支持 * Spring提供面向切面 ...

  7. Xcode.Subproject.And.Framework

    1. Easy Xcode Static Library Subprojects and Submodules http://www.blog.montgomerie.net/easy-xcode-s ...

  8. Mint UI 之 Swipe 组件

    #为什么不显示内容? 一定要指定 mt-swipe 元素的宽和高. <mt-swipe :auto="4000" class="swipe"> &l ...

  9. Mina 系列(二)之基础

    Mina 系列(二)之基础 Mina 使用起来多么简洁方便呀,就是不具备 Java NIO 的基础,只要了解 Mina 常用的 API,就可以灵活使用并完成应用开发. 1. Mina 概述 首先,看 ...

  10. 内建类型,与用户自定义类型,返回值为const

    1对内建类型来说,按值返回的是否为const,是无关紧要的,因为编译器已经不让它成为一个坐直,因为它总是一个值,而不是一个变量(thing in c++ page192) 2当处理用户自定义的类型时, ...