一、JVM和Java体系结构( 六 )


基于VM发布的国内第一个优化、深度定制且开源的高性能服务器版Java虚拟机 。
vm应用在阿里产品上性能高,硬件严重依赖intel的cpu,损失了兼容性,但提高了性能
10.12、 VM
谷歌开发的,应用于.系统,并在.2中提供了JIT,发展迅猛 。
VM只能称作虚拟机,而不能称作“Java虚拟机”,它没有遵循Java
虚拟机规范
不能直接执行Java的class文件
基于寄存器架构,不是jvm的栈架构 。
执行的是编译以后的dex( )文件 。执行效率比较高 。
.0使用支持提前编译(Ahead of Time ,AoT)的ART VM替换 VM.
10.13、其他JVM
具体VM的内存结构,其实取决于其实现不同厂商的VM,或者同一厂商发布的不同版本,都有可能存在一定差异 。主要以 为默认虚拟机 。
10.13、Graal VM
2018年4月, Labs公开了,号称"Run",勃勃野心 。与1995年java的”write once,run "遥相呼应 。
Graal VM在 VM基础上增强而成的跨语言全栈虚拟机,可以作为“任何语言”的运行平台使用 。语言包括:Java、Scala、、;C、C++、、Ruby、、R等
支持不同语言中混用对方的接口和对象,支持这些语言使用已经编写好的本地库文件
工作原理是将这些语言的源代码或源代码编译后的中间格式,通过解释器转换为能被Graal VM接受的中间表示 。Graal VM提供工具集快速构建面向一种新语言的解释器 。在运行时还能进行即时编译优化,获得比原生编译器更优秀的执行效率 。
如果说有一天真的被取代,Graal VM希望最大 。但是Java的软件生态没有丝毫变化 。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img--10)()]
二、类加载子系统 1、内存结构概述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img--10)()]
如果自己手写一个Java虚拟机的话,主要考虑哪些结构呢?
类加载器和执行引擎
2、类加载器与类的加载过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img--11)()]
类加载器子系统负责从文件系统或者网络中加载c1ass文件,class文件在文件开头有特定的文件标识 。
只负责class文件的加载,至于它是否可以运行,则由决定 。
加载的类信息存放于一块称为方法区的内存空间 。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)
2.1、类加载器角色
1.class file存在于本地硬盘上,可以理解为设计师画在纸上的模板,而最终这
个模板在执行的时候是要加载到JVM当中来根据这个文件实例化出n个一模一样的实例 。
2.class fi1e加载到JVM中,被称为DNA元数据模板,放在方法区 。
3.在.class文件->JVM->最终成为元数据模板,此过程就要一个运输工具(类装载器class ),扮演一个快递员的角色
2.2、加载:
1.通过一个类的全限定名获取定义此类的二进制字节流
2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3.在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类
的各种数据的访问入口
补充:加载.class文件的方式
2.3、链接
验证():
准备():
解析():
可以查看字节码文件反编译和二进制文件的结果
2.4、初始化
初如化阶段就是执行类构造器方法()的过程 。
此方法不需定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来 。