• 1. java虚拟机(JVM)简介@Frank Chan
  • 2. 什么是JVM???抽象规范 对JVM必须实现那些功能进行规范描述 一个具体的实现 由不同厂商对JVM抽象规范的具体实现 一个运行中的虚拟机实例 一个具体的程序必须运行与一个JVM实例之上
  • 3. JVM体系结构类装载器子系统 执行引擎 方法区 堆 Java栈 PC寄存器 本地方法栈 本地方法接口
  • 4. JVM体系结构示意图class文件类装载器子系统执行引擎本地方法接口运行时数据区方法区堆Java栈PC寄存器本地方法栈本地方法库
  • 5. 方法区和堆 每个jvm实例有一个方法区和堆,由jvm实例中的所有线程共享。 方法区类数据类数据类数据类数据类数据类数据类数据 堆对象对象对象对象对象对象对象对象
  • 6. pc寄存器、java栈和本地方法栈 每个线程有独立的pc寄存器、java方法栈和本地方法栈。 PC寄存器线程1线程2线程3 线程1 线程2 线程3 JAVA栈栈帧栈帧栈帧栈帧栈帧栈帧栈帧栈帧栈帧线程3 本地方法栈本地方法栈帧
  • 7. JVM体系结构类装载器子系统 执行引擎 方法区 堆 Java栈 PC寄存器 本地方法栈 本地方法接口
  • 8. 类装载器子系统职责 1.装载:查找并装载类型信息,放入方法区 2.连接: 验证:确保类型正确性 准备:为类变量分配内存 解析:符号引用替换成直接饮用 3.初始化:类变量初始化 分类: 启动类装载器:JVM实现的一部分 用户自定义类装载器:一个普通的java对象,派生自java.lang.ClassLoader 每个类装载器有独立的命名空间。 对于每个被装载的类型,JVM会为其创建一个java.lang.Class类实例。
  • 9. 类装载器子系统双亲委派模型 除启动类装载器,每个类装载器都有一个“双亲”类装载器。启动类装载器用户定义类装载器用户定义类装载器
  • 10. 类装载器子系统双亲委派模型实例 启动类装载器标准扩展类装载器类路径类装载器网络类装载器装载java API装载java标准扩展装载类路径class装载网络下载class
  • 11. 类装载器子系统双亲委派模型实例 装载一个网络下载类NetFriend? 装载java.lang.HashMap? 装载一个从网络下载的java.lang.Integer? 装载一个从网络下载的java.lang.Virus?
  • 12. 类装载器子系统由网络类装载器装载的java.lang.Virus能访问包java.lang中其它类的包级成员吗??? 运行时包:由同一个类装载器装载,属于同一个包,多个类型的集合。 允许两个类型之间对包内可见成员进行访问前,确定两个类型属于同一个包且属于同一个运行时包。
  • 13. JVM体系结构类装载器子系统 执行引擎 方法区 堆 Java栈 PC寄存器 本地方法栈 本地方法接口
  • 14. 方法区方法区存储类装载器装载的类的类型信息(从class文件中提取) 类型信息内容? 类全限定类名 直接超类全限定类名 类类型还是接口类型 类访问修饰符(public、abstract…) 直接超接口全限定类名列表 类型常量池 字段信息 方法信息 类变量 ClassLoader引用 Class引用 方法表
  • 15. 方法区常量池 包括直接常量和对其它类型、字段和方法的符号引用,解析之后变为符号引用。 字段信息 包括字段名、字段类型和字段修饰符 方法信息 包括方法名、返回类型、参数数量、参数类型和方法修饰符。 如果方法不是abstract和native,还有方法字节码、操作数栈大小、局部变量区大小和异常表信息。
  • 16. 方法区ClassLoader引用 获取装载类的类装载器引用 Class引用 获取方法区中的类信息
  • 17. 方法区方法表 方法表为一个数组结构,数组的每个元素是该类的一个方法的直接引用(包括从超类继承的方法)。 多态的实现依赖于方法表???方法数据指针方法数据指针方法数据指针方法数据指针方法数据方法数据方法数据方法数据
  • 18. JVM体系结构类装载器子系统 执行引擎 方法区 堆 Java栈 PC寄存器 本地方法栈 本地方法接口
  • 19. 堆一个Java虚拟机实例中的所有线程共享一个堆空间 对象实例和数组存放在堆空间中 一个对象是其类的一个实例,而这个对象的类信息都放在了方法区中,堆上应该存储对象的什么信息呢? 实例数据 例如:简单类型变量,指向堆上其它对象的引用等。
  • 20. 堆一种堆的实现方式 Java栈对象引用 堆 方法区方法区数据结构指针实例数据实例数据实例数据类数据指针方法数据指针方法数据指针方法数据指针类数据入口方法数据方法数据方法数据
  • 21. 堆方法的动态调用? 动态类型转换? instanceof?
  • 22. 堆数组在堆上的存储 具有相同维度和类型的数组在方法区中具有同一个类型信息。 堆上存储数组信息时,必须保存数组长度,数组数据和数组类数据指针。 多维数组在堆上存储为数组的数组。
  • 23. 堆数组在堆上的存储实例 int ar = new int[2][2]ar引用 堆类数据指针2ar[0]ar[1]类数据指针2ar[0][0]ar[0][1]类数据指针2ar[1][0]ar[1][1] 方法区[[I 类数据[I 类数据
  • 24. JVM体系结构类装载器子系统 执行引擎 方法区 堆 Java栈 PC寄存器 本地方法栈 本地方法接口
  • 25. Java栈每个线程独占一个栈,栈以栈帧为基本单位。 栈帧 一个栈帧代表一个方法调用。当调用一个方法时,线程将一个新的栈帧压入栈;当从一个方法返回或者抛出异常,线程从栈中弹出当前栈帧。
  • 26. Java栈栈帧组成 局部变量区 操作数栈 帧数据区
  • 27. Java栈局部变量区 以字长为单位,存储方法的参数和方法的局部变量 public static int runClassMethod(int i, long l, float f, double d, Object o, byte b) {return 0;} public int runInstanceMethod(char c, double d, short s, boolean b) {return 0;} 上述两个方法的局部变量区是什么???
  • 28. Java栈 runClassMethod() runInstanceMethod() 0 0 1 1 2 3 4 4 5 6 7 int(int i)long(long l) float(float f)double(double d) reference(Object o)int(byte b)reference(this)int(char c)double(double d)int(short s)int(boolean b)
  • 29. Java栈操作数栈 JVM中没有寄存器,所有的操作数访问必须通过操作数栈完成 操作数栈以字为基本单位,不同于局部变量区,数据访问不是通过索引,通过栈操作。 将2个局部变量的值相加,结果存入第3个局部变量中, JVM如何执行?
  • 30. Java栈 0 0 0 0 0 局部变量区 1 1 1 1 1 2 2 2 2 2 操作数栈100981009810098100981009819810010098198
  • 31. Java栈帧数据区 指向常量池的指针 方法区中异常表的引用 正常返回信息
  • 32. JVM体系结构类装载器子系统 执行引擎 方法区 堆 Java栈 PC寄存器 本地方法栈 本地方法接口
  • 33. JVM值得深究的问题JVM安全性策略 常量池解析 连接模型 垃圾回收 类型转换 异常 线程同步
  • 34. Question?class Father { public static String c_name = “cfather”; public String i_name = “ifather”; } class Son extends Father { public static String c_name = “cchild”; public String i_name = “ichild”; public static void main(String[] argv) { Father r = new Son(); System.out.println(“class var c_name: ” + r.c_name); System.out.println(“instance var i_name: ” + r.i_name); } }
  • 35. Question?(cont.)package java.lang class Virus { public static void main(String[] argv) { System.getCallerClass(); //throw security exception } }
  • 36. Book Recommended结合java源代码