文档章节

R大多年前的一篇老PPT,找不到原文了

code-fans
 code-fans
发布于 2016/10/28 22:39
字数 2133
阅读 156
收藏 0

为啥别读HotSpot VM的源码(2012-03-03)

  1. 1. Kris Mok, Software Engineer, Taobao@rednaxelafx莫枢 /“撒迦”
  2. 2. 为啥别读HotSpot VM的源码 第0次JVM源码阅读活动 阿里巴巴集团-技术共享平台- 核心系统研发-专用计算组 莫枢(撒迦) 2012-03-03
  3. 3. 关于我…• 2009年毕业自南京大学软件学院• 同年10月加入淘宝• 目前在参与JVM相关研发• 编程语言的设计与实现爱好者• 希望与各位同好多交流! – 博客: http://rednaxelafx.iteye.com/ – 新浪微博: http://weibo.com/rednaxelafx – 高级语言虚拟机群组: http://hllvm.group.iteye.com/ – JVM源码阅读活动微群: http://q.weibo.com/1823766
  4. 4. 分享目标(I)• 让VM相关基础知识尚浅的人找到阅读 HotSpot VM源码之外的学习JVM的路径• 让并不真的对VM内部实现细节感兴趣的人 不必在源码上耗费精力
  5. 5. 分享目标(II)• 为后续活动做准备 – 确定活动周期、形式、目标受众 – 吸引同好报名分享阅读VM源码的经验
  6. 6. 突击提问• 已读过或正在读OpenJDK的源码?• 已读过或正在读其它VM的源码?• 有兴趣自己动手实现VM?• 有编译器/解释器的实现经验?
  7. 7. 突击提问(II)• PermGen – a. 不知道是什么? – b. 在“堆内”? – c. 在“堆外”? – d. 不关心?
  8. 8. 为啥要读HotSpot VM的源码?• 生产环境使用Oracle/Sun JDK或OpenJDK – 读源码有助解决问题(真能么?)• 三大主流高性能JVM中唯一开源的 – 另外两个的源码也读不到• 想修炼内功 – “现实”驱动还是真感兴趣?• 找点乐子• 其它
  9. 9. 读HotSpot VM源码想了解什么?• JVM crash了!为什么?怎么办?• JVM报OutOfMemoryError了 …• 想学习如何操纵字节码• “这段代码创建了多少个对象”?• “JVM会让String共享char[]”?• 其它
  10. 10. 理想与现实(I)例子:JVM的架构与知识点
  11. 11. 概念中JVM的结构 类加载器Class文件 子系统 内存空间 自动内存 本地 管理 方法区 Java堆 Java栈 方法栈地址 数据 和指令 指令计数器 本地方法 以及其它 执行引擎 接口 本地方法库 隐含寄存器
  12. 12. 某个JVM实现的架构
  13. 13. HotSpot Server Compiler的优化
  14. 14. 理想与现实(II)例子:iadd字节码指令的实现
  15. 15. 例:概念 3) add value1 + value2 1) pop 4) pushvalue2 2) pop value1 +value1 value2 JVM规范所规定的抽象行为
  16. 16. 例:理想——简单直观case SVM_INSTRUCTION_IADD: { /* instruction body */ jint value1 = stack[stack_size - 2].jint; ② jint value2 = stack[--stack_size].jint;① stack[stack_size - 1].jint = value1 + value2; ④ ③ /* dispatch */ goto dispatch;} 取自SableVM的switch版解释器 (sablevm/src/libsablevm/instructions_switch.c)
  17. 17. 例:现实——简单但不那么直观 ① ② ④ ③ 取自早期版本Maxine VM的模板JIT编译器
  18. 18. 例:现实——有点绕弯void TemplateTable::iop2(Operation op) { transition(itos, itos); switch (op) { case add : __ pop_i(rdx); __ addl (rax, rdx);break; case sub : __ movl(rdx, rax); __ pop_i(rax); __ subl (rax, rdx);break; case mul : __ pop_i(rdx); __ imull(rax, rdx);break; case _and : __ pop_i(rdx); __ andl (rax, rdx);break; case _or : __ pop_i(rdx); __ orl (rax, rdx);break; case _xor : __ pop_i(rdx); __ xorl (rax, rdx);break; 取自HotSpot VM的模板解释器,AMD64版 case shl : __ movl(rcx, rax); __ pop_i(rax); __ shll (rax);break; case shr : __ movl(rcx, rax); __ pop_i(rax); __ sarl (rax);break; case ushr : __ movl(rcx, rax); __ pop_i(rax); __ shrl (rax);
  19. 19. 例:现实——很多细节void LIR_Assembler::arith_op(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr dest, CodeEmitInfo* info, bool pop_fpu_stack) { if (left->is_single_cpu()) { Register lreg = left->as_register(); if (right->is_single_cpu()) { // cpu register - cpu register Register rreg = right->as_register(); switch (code) { case lir_add: __ addl (lreg, rreg); break; // ... 取自HotSpot VM的 Client编译器,AMD64版 } } else if (right->is_stack()) { // cpu register - stack Address raddr = frame_map()-> address_for_slot(right->single_stack_ix()); switch (code) { case lir_add: __ addl(lreg, raddr); break; // ... } } else if (right->is_constant()) { // cpu register - constant jint c = right->as_constant_ptr()->as_jint(); switch (code) { case lir_add: __ incrementl(lreg, c); break; // ... }
  20. 20. learn JVM without reading HotSpot VM’s source code不读HOTSPOT VM的源码
  21. 21. 为何不要读HotSpot VM的源码?• 基础概念不扎实时 – 硬读复杂实现的源码对理解基础概念帮助不大 – 繁琐的实现细节反而会掩盖掉一些抽像概念• 已有现成的阅读资料时 – 读资料比读源码更容易吸收自己需要的信息 • 因人而异• 可参加“源码阅读活动” – 让别人读源码,等分享…?
  22. 22. 不明就里读源码的坏处?• 加深误解 – 案例1:HotSpot VM的解释器是这样实现的! • 主流平台上的HotSpot VM使用“模板解释器”,而非这里 说的“C++解释器” – 案例2:HotSpot VM用内部地址实现Java对象的 hashCode()! • oopDesc才是HotSpot VM中表示Java对象的类型; ciObject不是• 浪费时间/精力 – 读了但全然无法理解,还不如先不读 – 有些细节知道了也没用(视目的而异)
  23. 23. 如何不读HotSpot VM的源码• 仅为了理解Java程序的行为? – 是否已了解Java语言层面的规定? • 否 => 先读Java语言规范 – 是否已了解JVM的抽像概念? • 否 => 先读JVM规范 – 已确定想关注的行为是特定于某个实现? • 否 => 回到前面两点 – 是否有关于该实现的行为的文字描述? • 是 => 先读文字描述 • 否 => 那…真的要读源码么?
  24. 24. 如何不读HotSpot VM的源码(续)• 仍然想深入学习VM的内部知识? – 阅读相关背景知识的书、论文、博客等 • 能够(在读源码前)事先了解许多术语 • 知道术语便于找到更多资料 – 阅读更简单一些的VM实现的源码 • 循序渐进 – 自己动手写简单的编译器/VM • 实践是检验真理的唯一标准 – 最后… • 如果真的很有空才去读HotSpot VM的源码
  25. 25. 如何不读HotSpot VM的源码(续)• 工作就是鼓捣HotSpot VM的内部? – 那真的得读代码,而且还得非常仔细地读 – 但动态调试比静态阅读代码更有助形象地理解 – 入手顺序 • 文档 • 读代码 • 做实验+调试
  26. 26. alternative JVMs其它JVM
  27. 27. KVM• 项目主页: – http://java.sun.com/products/cldc/• 介绍: – http://java.sun.com/products/cldc/wp/ 简单小巧的JVM
  28. 28. KVM (续)• 好处 – 包含JVM的最核心组件 – 实现方式与JVM规范所描述的抽象的JVM相近• 坏处 – 是Java ME CLDC VM,而不是Java SE VM – 未实现反射、浮点数计算等功能
  29. 29. Maxine VM• 项目主页: – http://labs.oracle.com/projects/maxine/• 介绍: – https://wikis.oracle.com/download/attachment s/4161575/The+Maxine+Virtual+Machine.pdf 纯Java实现的JVM
  30. 30. Maxine VM(续)• 可在IDE里开发和调试• 二进制兼容性 – 可使用Oracle JDK/OpenJDK的类库,兼容主 流Java应用
  31. 31. Maxine VM(续)• 与HotSpot VM的部分对应关系 – 对HotSpot Client Compiler(C1)感兴趣的, 可以读Maxine VM里的C1X来帮助理解 • 可通过C1Visualizer以图形界面更好的理解该编译器 的设计 – 对HotSpot Server Compiler(C2)里的中间表 现形式(Sea-of-nodes IR)感兴趣的,可以读 Maxine VM里的Graal来帮助理解 • 可通过IdealGraphVisualizer以图形界面理解该编译 器的设计
  32. 32. 演示:Maxine Inspector
  33. 33. 演示:C1Visualizer
  34. 34. 演示:IdealGraphVisualizer
  35. 35. VMKit / J3• 项目主页: – http://vmkit.llvm.org/• LLVM + MMTk + GNU Classpath 现成组件搭积木实现的JVM
  36. 36. 其它项目• 其它值得阅读源码的 • 其它值得阅读源码的 JVM 非JVM项目 – Jikes RVM / MRP – ASM – JamVM – cacaovm • 其它值得实验的项目 – SableVM – BiteScript
  37. 37. recommended reading推荐阅读
  38. 38. VM相关书堆…
  39. 39. 我读过的VM相关书• 请参考豆瓣页面 http://book.douban.com/people/Rednaxela FX/all?tag=VM• 基础知识主要靠这些书获得,通过自己写 代码来理解• 但比较深入的知识通常是从论文而不是书 中获得的• Anyway,规范一定要读!
  40. 40. 计算机系统概论• http://book.douban.com/subject/2185076/
  41. 41. 深入理解计算机系统• http://book.douban.com/subject/5407246/
  42. 42. 程序设计语言——实践之路• http://book.douban.com/subject/2152385/
  43. 43. 虚拟机——系统与进程的通用平台• http://book.douban.com/subject/1885761/
  44. 44. 游戏脚本高级编程• http://book.douban.com/subject/1927405/
  45. 45. Inside the Java 2 Virtual Machine• http://book.douban.com/subject/1788390/
  46. 46. 深入理解Java虚拟机• http://book.douban.com/subject/6522893/
  47. 47. 深入嵌入式Java虚拟机• http://book.douban.com/subject/1103575/
  48. 48. Python源码剖析• http://book.douban.com/subject/3117898/
  49. 49. Shared Source CLI Essentials• http://book.douban.com/subject/1484763/
  50. 50. 编译原理 技术与工具• http://book.douban.com/subject/2970069/
  51. 51. 深度探索C++对象模型• http://book.douban.com/subject/1091086/
  52. 52. Oracle JRockit: The Definitive Guide• http://book.douban.com/subject/4873919/
  53. 53. Java Performance• http://book.douban.com/subject/5980062/
  54. 54. The Garbage Collection Handbook• http://book.douban.com/subject/6809987/
  55. 55. The School of Niklaus Wirth• http://book.douban.com/subject/3152171/
  56. 56. QUESTIONS?
  57. 57. Kris Mok, Software Engineer, Taobao@rednaxelafx莫枢 /“撒迦”

本文转载自:http://www.slideshare.net/RednaxelaFX/hotspot-vm20120303

code-fans
粉丝 2
博文 79
码字总数 7180
作品 0
广州
程序员
私信 提问
个人空间全面改版即将在本周内上线~~

年前就开始策划和开发,到昨天为止功能基本上稳定下来了,虽然还有不完善的地方,但比较明显的bug也解决了。 我们计划在本周内将上线该版本,可能在周末吧(人比较少,静悄悄的) 因为此次改...

红薯
2011/03/07
486
15
IT人士的知识管理-第一篇

IT人士的知识管理-第一篇 1.为什么我们需要知识管理? PKM个人知识管理对于提高个人的学习能力有非常显著的帮助,身边的很多朋友都深知知识管理的重要性,但是大多懒得去学,或者一知半解。尤...

陈鑫杰
2013/09/05
0
0
Apache环境.htaccess伪静态301跳转(www与不带www)

之前老左分享过一篇"LNMP系列教程之五:设置301重定向的方法"一文,我们可以很容易的在nginx环境下设置301跳转。一般而言,我们使用的301跳转就是WWW与不带WWW域名之间的跳转,用行话说就是权...

科技小能手
2017/11/12
0
0
补上之前被和谐的坑

之前一篇《很污的机器学习:从xhamster网站找到喜欢的片子》被和谐了个干干净净,一点痕迹都没有留下,我本想也就算了,结果老有人问我文章去哪儿了,怎么能看到。 而且大多问Logistic怎么做...

清雨影
2017/03/14
0
0
云上企业数据库最佳实践

云上企业数据库最佳实践 一个故事@MySQL DBA2017-12-303 阅读 数据库 这是一个PPT,是我在12月20日北京云栖大会上做的分享,介绍了云上企业数据库常见的挑战和对应的策略和产品。云上企业数据...

一个故事@MySQL DBA
2017/12/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android Binder机制 - interface_cast和asBinder讲解

研究Android底层代码时,尤其是Binder跨进程通信时,经常会发现interface_cast和asBinder,很容易被这两个函数绕晕,下面来讲解一下: interface_cast 下面根据下述ICameraClient例子进行分析...

天王盖地虎626
昨天
5
0
计算机实现原理专题--存储器的实现(二)

计算机实现原理专题--存储器的实现(一)中描述了一种可以记住输入端变化的装置。现需要对其功能进行扩充,我们将上面的开关定义为置位,下面的开关定义为复位,然后需要增加一个保持位,当保...

FAT_mt
昨天
3
0
集合--Collection与迭代

1.1Collection 集合 集合:集合是Java提供的一种容器技术,可以用来存储多个数据 集合与数组的区别: 数组的长度是固定的,集合的长度是可变的 数组中存储的是同类型的元素,存储基本数据类型...

Firefly-
昨天
10
0
聊聊rocketmq的consumeTimeout

序 本文主要研究一下rocketmq的consumeTimeout consumeTimeout rocketmq-client-4.5.2-sources.jar!/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java public class Defaul......

go4it
昨天
3
0
JAVA--高级基础开发

Day13[Map集合练习题] 练习一:Map接口的特点 请简述Map 的特点: Map集合中存放的数据都是键值对,并且键不能相同,值可以相同。 Map集合中的Key是根据Set集合来存放的。 Map集合可以使用n...

李文杰-yaya
昨天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部