jvm lock低性能分析
日志平台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低性能分析的更多相关文章
- java面试-JDK自带的JVM 监控和性能分析工具用过哪些?
一.JDK的命令行工具 1.jps(JVM Process Status Tools):虚拟机进程状况工具 jps -l 2.jinfo(Configuration Info for java):Ja ...
- JVM性能分析与优化
JVM性能分析与优化: http://www.docin.com/p-757199232.html
- 【转】JVM虚拟性能分析
JDK自带的JAVA性能分析工具.它已经在你的JDK bin目录里了,只要你使用的是JDK1.6 Update7之后的版本.点击一下jvisualvm.exe图标它就可以运行了. 这里是VisualV ...
- JVM性能分析工具详解--MAT等
获得堆转储文件 巧妇难为无米之炊,我们首先需要获得一个堆转储文件.为了方便,本文采用的是 Sun JDK 6.通常来说,只要你设置了如下所示的 JVM 参数: -XX:+HeapDumpOnOutOf ...
- 性能分析神器VisualVM
VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量数据.跟踪内存泄漏.监控垃圾回 ...
- 性能分析之-- JAVA Thread Dump 分析综述
性能分析之-- JAVA Thread Dump 分析综述 一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...
- jstack(查看线程)、jmap(查看内存)和jstat(性能分析)
公司内部同事分享的一篇文章 周末看到一个用jstack查看死锁的例子.昨天晚上总结了一下jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令.供大家参考 1.Jstack 1.1 ...
- jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令 公司内部同事分享的一篇文章 周末看到一个用jstack查看死锁的例子.昨天晚上总结了一下jstack(查看线程).jma ...
- 命令:jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
命令:jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令 这些命令 必须 在 linux jdk bin 路径 下执行 eq: ./jstack 10303 即可 如果想把 ...
随机推荐
- input限制数字输入
onkeyup="this.value=this.value.replace(/\D/g,'')"
- spotlight
spotlight - 必应词典 美['spɑt.laɪt]英['spɒt.laɪt] n.聚光灯:聚光灯照亮的地方:聚光灯照明圈:媒体和公众的注意 v.用聚光灯照:突出报道(以使公众注意) 网络射灯 ...
- MySQL基本操作之命令行操作
MySQL基础操作 MySQL基础操作--命令行操作
- ROS学习笔记二(创建ROS软件包)
catkin软件包的组成 一个软件包必须满足如下条件才能被称之为catkin软件包: 必须包含一个catkin编译文件package.xml(manifests文件),此文件包含了描述该软件包的重要信 ...
- VINS-mono详细解读
VINS-mono详细解读 极品巧克力 前言 Vins-mono是香港科技大学开源的一个VIO算法,https://github.com/HKUST-Aerial-Robotics/VINS-Mono ...
- Spring框架的特点
1. 为什么要学习Spring的框架 * 方便解耦,简化开发 * Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理 * AOP编程的支持 * Spring提供面向切面 ...
- Xcode.Subproject.And.Framework
1. Easy Xcode Static Library Subprojects and Submodules http://www.blog.montgomerie.net/easy-xcode-s ...
- Mint UI 之 Swipe 组件
#为什么不显示内容? 一定要指定 mt-swipe 元素的宽和高. <mt-swipe :auto="4000" class="swipe"> &l ...
- Mina 系列(二)之基础
Mina 系列(二)之基础 Mina 使用起来多么简洁方便呀,就是不具备 Java NIO 的基础,只要了解 Mina 常用的 API,就可以灵活使用并完成应用开发. 1. Mina 概述 首先,看 ...
- 内建类型,与用户自定义类型,返回值为const
1对内建类型来说,按值返回的是否为const,是无关紧要的,因为编译器已经不让它成为一个坐直,因为它总是一个值,而不是一个变量(thing in c++ page192) 2当处理用户自定义的类型时, ...