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 即可 如果想把 ...
随机推荐
- Python repr() 函数
Python repr() 函数 Python 内置函数 描述 repr() 函数将对象转化为供解释器读取的形式. 语法 以下是 repr() 方法的语法: repr(object) 参数 obje ...
- LibreOJ 6277 数列分块入门 1(分块)
题解:感谢hzwer学长和loj让本蒟蒻能够找到如此合适的入门题做. 这是一道非常标准的分块模板题,本来用打标记的线段树不知道要写多少行,但是分块只有这么几行,极其高妙. 代码如下: #include ...
- 批量MD5命名文件
#coding=utf-8 import os import hashlib def GetFileMd5(filename): if not os.path.isfile(filename): pr ...
- jdeveloper基础教程(中文版)
jdeveloper基础教程(中文版) 程序员的基础教程:菜鸟程序员
- 配置Spring框架编写XML的提示
1. 步骤一:先复制, http://www.springframework.org/schema/beans/spring-beans.xsd 2. 步骤二:搜索XML Catalog,点击Add按 ...
- vue2.0 element学习
1,bootstrap和vue2.0结合使用 vue文件搭建好后,引入jquery和bootstrap 我采用的方式为外部引用 在main.js内部直接导入 用vue-cli直接安装jquery和bo ...
- VMware workstation 设定开机引导等待时间
找到虚拟机磁盘文件所在的目录,编辑里面的扩展名为vmx文件,记事本即可操作,在末尾加入如下一行: bios.bootDelay = "20000" 这里的数字是毫秒,上面例子中的数 ...
- boost::asio 学习草稿
http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio/ 可以多个线程拥有io_ ...
- spring mvc MultipartFile 上传文件 当文件较小时(10k) ,无法上传成功 。
<!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 --> <bean id="multipartResolver" cla ...
- 新电脑的操作系统win10的所有设置问题汇总
上来改的win7发现很多驱动没法装,装了也不能用,后来只能改win10了,另外win7的风扇声音也很大. 1.关闭win10自动更新.在服务里面禁用winupdate 2.注销改成了点头像,然后点注销 ...