Java虚拟机学习笔记(1~6)

---恢复内容开始---

一、认识Java

  • 从广义上讲,Clojure、JRuby、Groovy等运行于Java虚拟机上的语言及其相关的程序都属于Java技术体系中的一员。
  • 从传统意义上讲,Sun官方所定义的Java技术体系包括:Java程序设计语言、各种硬件平台上的Java虚拟机、Class文件格式、Java API类库、来自商业机构和开源社区的第三方Java类库。

二、Java体系4个平台

  • Java Card:支持一些Java小程序(Applets)运行在小内存设备(如智能卡)上的平台。
  • Java ME(Micro Edition):支持Java 程序运行在移动终端(手机、PDA)上的平台,对Java API有所精简,并加入了针对移动终端的支持,这个版本以前称为J2ME。
  • Java SE(Standard Edition):支持面向桌面级应用(如Windows下的应用程序)的Java平台,提供了完整的Java核心API,这个版本以前称为J2SE。
  • Java EE(Enterprise Edition):支持使用多层架构的企业应用(如ERP、CRM应用)的Java平台,除了提供Java SE API外,还对其作了大量的补充并提供了相关的部署支持,这个版本以前称为J2EE。

三、几种虚拟机

  • Sun HotSpot VM:它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的虚拟机。
  • Apache Harmony:它包含自己的虚拟机和Java库,用户可以在上面运行Eclipse、Tomcat、Maven等常见的Java程序,但是他没有通过TCK认证,所以不能用“Apache的JDK”来说明。
  • Dalvik VM:它是Android平台的核心组成部分之一。它并不是一个Java虚拟机,它没有遵循一个Java虚拟机的规范,不能直接执行Java的Class文件,使用的是寄存器架构而不是JVM中常见的栈架构。然而,Dalvik VM执行的dex(Dalvik Executable)文件可以通过Class文件转化而来,使用Java 语法编写应用程序,可以直接使用大部分的Java API等。

四、Java内存区域

 五、程序计数器

  1. 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
  2. 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于对核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个的独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。
  3. 如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数值则为空(Undefined)。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemeryError情况的区域。

六、Java虚拟机栈

  1. Java虚拟机栈(Java Virtual Machine Stacks)是线程私有的,它的生命周期与线程相同。
  2. Java虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
  3. 在Java虚拟机规范中,对这个区域规定了两种异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展(当前大部分的Java虚拟机都可动态扩展,只不过Java虚拟机规范中也允许固定长度的虚拟机栈),如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。

---恢复内容结束---

posted @ 2019-01-17 01:49  阿禾的粉  阅读(98)  评论(0)    收藏  举报