论坛首页 Java企业应用论坛

虚拟机中的锁优化简介(适应性自旋/锁粗化/锁削除/轻量级锁/偏向锁)

浏览 18009 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-04-27   最后修改:2011-04-27
学习了,谢谢IcyFenix

怎么最近的牛都夜间活动了。。

继续关注VM~
0 请登录后投票
   发表时间:2011-04-27  
peterwei 写道
shaomeng95 写道
楼主太猛了,我一直想搞清楚JVM的东西,请问你都是从哪里学来的,给小弟点指引吧

网上很多资料,看你想不想学。深入jvm搞清楚了,才能和这帮人扯。我是暂时没精力搞这些东西,只能粗粗的了解,以免以后被bs。

我有学习过很多JVM的知识,只是很多的知识点零散,甚至大家吵来吵去都不知道谁说的是对的,呵呵
0 请登录后投票
   发表时间:2011-04-27  
目录很吸引人的。。。看page感觉内容是不是少了点?
0 请登录后投票
   发表时间:2011-04-27  
LSQ6063 写道
目录很吸引人的。。。看page感觉内容是不是少了点?

不好意思,写错了
0 请登录后投票
   发表时间:2011-04-27  
真的很期待!
0 请登录后投票
   发表时间:2011-04-27  
IcyFenix 写道
LS这个夜猫子……

别说我,你不是比我还晚么…

IcyFenix 写道
关于这个例子,我首先找一个替罪羊出来:Jeroen Borgers的《Do Java 6 threading optimizations actually work?》,例子来源于此,就用来理解原理是没有什么问题的,虽然理想与现实总是有点差距。

嗯啊我知道例子的源头在哪里。事实上我最初看到JDK6里关于锁削除/偏向锁的宣传例子就是关于“有了这些优化之后,StringBuilder与StringBuffer在许多场景里性能就一样了”。但这着实不是个好例子,因为在实际的实现上使用了具体的代码来举例,那好歹要确认它真的是能行的。不然不就是忽悠了嘛…
所以找替罪羊是不对的哦 >_< 读过的资料自己验证过了才会成为自己的知识。

IcyFenix 写道
RednaxelaFX 写道
可以看到输出了么?通过强制调整JIT编译器的一些配置项,这例子的锁削除优化就真的成立了。猜猜看为什么?
(提示:再多开几个别的参数就能很明显的看出来 )

“别的参数”我加了这2个:
-XX:+PrintCompilation -XX:+PrintInlining

嗯bingo,我也是用这两个参数。你已经掌握窍门了 XD
于是你知道前后两版本的差异的原因了么?
(我还用了别的一些参数,例如-XX:+PrintAssembly和-XX:+PrintOptoAssembly,读生成的代码来确认真的是在Foo.concatString()里削除了锁。想知道详细的话回头有空了我可以发帖。)

IcyFenix 写道
另,抗议两个windows版6u25 fastdebug坑爹的事情,一个是:
D:\Develop\jdk1.6.0_25_fastdebug\bin>java -XX:+PrintEliminateLocks TestLockElision
VM option '+PrintEliminateLocks'
Unrecognized VM option '+PrintEliminateLocks'
Could not create the Java virtual machine.

D:\Develop\jdk1.6.0_25_fastdebug\bin>java -version
java version "1.6.0_25-ea-fastdebug"
Java(TM) SE Runtime Environment (build 1.6.0_25-ea-fastdebug-b03)
Java HotSpot(TM) Client VM (build 20.0-b10-fastdebug, mixed mode)

你可以用跟我用的一样的版本嘛…JDK 6 update 25 build 01
当然,那不是本质问题。真正的问题是:你用的是client VM啊……
HotSpot VM只在server VM里实现了锁削除的优化,相关的参数也是只有server VM才有的。
所以你必须要加上-server因为你在Windows上默认选择了client VM…我在Linux上不用加-server是因为x64 Linux上的JDK里只有server VM。

IcyFenix 写道
另外一个是你给的参数那个单引号= =#,linux和win版有这样的差异么?我试了jdk7和6u25两个版的都不认加了引号的,必须去掉才行,问题不大,不过为了避免别的同学做试验产生困扰,稍微提一下。
引用
-XX:CompileCommand='compileonly,Foo.*' -XX:CompileCommand='compileonly,java/lang/StringBuffer.*'

是啊,Windows上单引号就不对了。所以我这不是把我执行的环境说清楚了嘛,其它环境的细微调整就看自己了 XD
0 请登录后投票
   发表时间:2011-04-27  
-XX:+PrintAssembly和-XX:+PrintOptoAssembly生成的代码撒迦在HLLVM上讲解一下吧。Java号称高级语言,很多问题还是必须要依赖C++和汇编的基础@_@,这方面与你的差距是非常本质的。
0 请登录后投票
   发表时间:2011-04-27  
来点服务器风就好了!个人觉得这个大家都需要!做web的都离不开服务器!
0 请登录后投票
   发表时间:2011-04-27  
虽然研究不深,但是看楼主的目录东西还是多,楼主精神可嘉
0 请登录后投票
   发表时间:2011-04-27  
The Hotspot Java Virtual Machine
Paul Hohensee
paul.hohensee@sun.com
Senior Staff Engineer, Hotspot JVM, Java SE
Sun Microsystems
跟上述这篇文档有不少重叠的内容
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics