二月份杭州GreenTea JUG的收获

5.25号的greentea活动有事没去参加,这是2月份那次greentea杭州的活动记录,当时有两个会场,只听了一个会场的。

昨天下午去华星时代广场参加了greentea java用户组,听了周忱的《java程序员也要懂cpu》
莫枢的《Intrinsic Methods in Hotspot VM》,以及王铮的《有关jvm profile的工作》还是很有收获的。
因为相对偏底层,平时不太涉及,尤其王铮的分享,传递了一个观念,硬件的设计与软件是很有差异的;在软件中的性能问题在硬件中或许根本不存在,硬件天生是并行的,软件则是串行的。

Intrinsic方法简单的说就是jvm对某些声明为了intrinsic的方法进行特殊的处理,不按照java里提供的代码逻辑或者jni里的实现,而是按照特定平台优化后的指令来处理,比如System.arraycopy 虽然声明为native(让人误以为可能比java实现更慢),但实际它是一个intrinsic的方法,它实际比你自己在java中来实现数组拷贝要更高效的。甚至在vm里用同样的实现逻辑,被标记为intrinsic的也依然可能比未标记intrinsic的要高效。

jdk中有哪些Intrinsic方法,可以在vmSymbols文件里找到,但温绍说他测试某些intrinsic的方法反而慢了
这个需要在特定的平台,特定的cpu,需要几个条件都符合,而目前并没有每个版本的jdk中哪些intrinsic的详尽描述的文档。

莫枢除了对Intrinsic方法的介绍,还回答了一下避免让两个数据在同一个cache line在java8里的实现:采用
@Contented 注释来避免false sharing的问题,不必在程序中写丑陋的padding 变量来实现了。

另外对Hotspot去除permgen的进度,需要到java8才会去除了。还纠正了我对hotspot jdk7中String.intern一个误区;String.intern 并不是直接存放在老生代,是在heap中,依然会经过新生代到老生代的过程,在young gc后才移到老生代。这也是对permgen移除的一部分工作,在jdk7里先release了这部分。

莫枢还演示了一个工具CLHSDB,除了普通的定位内存地址,还可以采用js来实现扩展它的命令。

发表评论

电子邮件地址不会被公开。 必填项已用*标注