第一章、JVM和Java体系结构
一次编译,到处运行,是因为不同的操作系统对java虚拟机都有各自的实现,java语言运行在java虚拟机上,与平台无关,java虚拟机屏蔽了操作系统差异性。
任何语言编译成的class的字节码文件只要符合虚拟机规范要求,都可以在虚拟机上运行虚拟运行的是Class字节码文件,和java源文件没有关联。
所谓虚拟机,其实就是一台虚拟的机器,可以用来执行一系列虚拟的命令。大体上虚拟机可以分为两种:系统虚拟机和程序虚拟机。
- 程序虚拟机
-
方法区和堆区是所有线程共享的内存区域;而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域。
-
Java栈又叫做jvm虚拟机栈
-
方法区(永久代)在jdk8中又叫做元空间Metaspace
-
方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器(JIT编译器,英文写作Just-In-Time Compiler)编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。
-
在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代
-
在JDK1.7 字符串常量池被从方法区拿到了堆中, 这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区, 也就是hotspot中的永久代
-
在JDK1.8之后JVM 已经将运行时常量池从方法区中移了出来,在Java堆(Heap)中开辟了一块区域存放运行时常量池。同时在 jdk 1.8中移除整个永久代,取而代之的是一个叫元空间(Metaspace)的区域
-
由于跨平台的设计,java的指令都是根据栈来设计的
二者区别:
-
-
栈:适用于资源受限的场景、设计实现简单。跨平台性、指令集小、指令多;执行性比寄存器差
-
-
-
寄存器:指令少
-
通过引导类加载器(Bootstrap ClassLoader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的.
6.2、执行
-
一个运行中的java虚拟机有着一个清晰的任务:执行Java程序;
-
程序开始执行的时候他才运行,程序结束时他就停止;
-
执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程。
6.3、退出
-
程序正常执行结束
-
程序异常或错误而异常终止
-
操作系统错误导致终止
-
某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且java安全管理器也允许这次exit或halt操作
-
七、JVM的发展历史
-
SUN Classic
-
Exact VM
-
HotSpot VM :HotSpot指热点代码探测技术
-
BEA JRockit:(BEA 已被Oracle收购) 专注于服务端应用,世界最快的jvm之一
-
IBM J9
-
Taobao JVM: 目前已经在淘宝、天猫上线,替换了Oracle官方JVM;
-
Graal VM: Oracle 2018年4月公开,口号 Run Programs Faster Anywhere.最可能替代HotSpot的产品