Java虚拟机整体思路
Posted shushulelan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java虚拟机整体思路相关的知识,希望对你有一定的参考价值。
我们日常编程的Java编程是在Java语言规范代码,通过javac前端编译器编译器,产生字节码规范,此时我们应该对字节码文件结构有一个大致的认识,此时我们了解了Java虚拟机内存面局(专业术语叫运行时数据区),类加载器通过加载器将字节码文件加载到内存中(此时应该对类加载的过程有一个大致的了解),Java类信息就会存储在我们的方法区中,如果创建对象,那么数据对象就会放到Java堆中,如果调用方法就用到PC寄存器、Java虚拟机栈、本地方法栈等结构。
从源代码到机器码,使用AOT编译器,从字节码到机器码我们可以选择解释执行,也可以选择编译执行(JIT),编译执行又分为C1编译模式和C2编译模式。C1优化相对保存但编译速度快速,C2优化比较激进,但编译速度比C1慢,但是编译质量相对较好。
《深入理解Java虚拟机》读书笔记——第1章 走近Java
(注:原文请见《深入理解Java虚拟机》周志明 著,知识点部分参考百度百科)
总述
第1章分为两个部分:Java概述及自己动手编译JDK的教程。
1 Java概述
介绍了Java的整体特性、Java的技术体系组成、Java及JVM的发展史。
1.1 Java的总体特性
1)Java不仅仅是一门编程语言,更是由一系列计算机软件和规范组成的技术体系。
2)Java具有众多优点:
a.Java虚拟机在千差万别的物理机上建立了统一的运行平台,实现了跨平台性。(主要)
b.提供了相对安全的内存管理和访问机制,避免了绝大部分的内存泄漏和指针越界问题。
c.实现了热点代码检测和运行时编译及优化,使得Java应用能随着运行时间的增加而获得更高的性能。
d.完善的应用程序接口及大量第三方类库的支持
3)Java目前短板:(截至JDK1.7)
a.Java尚不支持模块化,主要由于Sun公司提出的JSR没有获得通过,但是在Sun公司在OpenJDK中建立了一个名为Jigsaw的项目用来推动Sun提出的JSR标准在Java平台中转为具体实现。此外,IBM提出了自己的Java平台模块化标准JSR-291:Java SE动态组件支持(实际就是OSGi R4.1)。
b.函数式编程的一个重要优点是能够天然地适应并行运行。目前在Java中可以实现函数式编程,但是会带来代码的臃肿,在Java 8中,将会提供Lamda支持来改善对函数式编程的支持。
c.Java虚拟机很早之前就支持64位系统了,但Java程序运行在64位虚拟机上需要付出比较大的额外代价:由于指针膨胀和各种数据类型对其补白的问题,需要消耗更多内存,通常要比32位系统增加10%~30%的内存消耗;在运行速度上全靠面落后于32位虚拟机,大约有15%的性能差距。为此Sun公司提供了指针压缩功能,但是,开启指针压缩会增加执行代码的数量。
1.2 Java技术体系组成
Sun公司所定义的Java技术体系包括以下几个部分:
1)Java程序设计语言
2)JVM
3)Class文件格式
4)Java API类库
5)第三方Java类库
JDK(Java Development Kit,用于支持Java程序开发的最小环境)包括:Java程序设计语言、JVM、Java API类库。
JRE(Java Runtime Environment,支持Java程序运行的标准环境)包括:Java程序设计语言、JVM、Java SE API子集。
JDK 1.8 示意图
按技术领域可以划分成4个平台:
1)Java Card:为Java小程序(Applets)在小内存设备(如智能卡)上运行提供支持。
2)Java ME(Micro Edition):移动终端(手机、PAD)。对Java API有所精简,并加入了针对移动端的支持。
3)Java SE(Standard Edition):桌面级应用。提供了完整的Java核心API。
4)Java EE(Enterpeise Edition):企业级应用(如ERP(Enterprise Resource Planning),CRM(Customer Relationship Management)应用)。除提供Java SE API外,还对其做了大量的扩充并提供了相关部署支持。
2 其他知识点:
1)Class文件:全称Java Class文件。采用C/C++等传统语言编写的程序通常首先被编译,然后被连接成单独的、专门支持特定硬件平台及操作系统的二进制文件,通常一个平台上的二进制可执行文件不能在其他平台上运行,主要是由于这个二进制文件包含了对目标处理器的机器语言。而Java编译器把Java源文件的指令翻译成字节码,这种字节码就是Java虚拟机的“机器语言”,与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。
2)JVM通过编译器和解释器协同工作达到高效的目的。
编译器和解释器的联系和区别:解释器和编译器都要进行词法分析、语法分析和语义分析,之后,二者开始有所分别。解释器在语义分析后选择了直接执行语句;编译器在语义分析后选择将将语义存储成某一种中间语言,之后通过不同的后端翻译成不同的机器语言(可执行程序)。
编译器和解释器的联系和区别参见:http://www.cnblogs.com/sword03/archive/2010/06/27/1766147.html
以上是关于Java虚拟机整体思路的主要内容,如果未能解决你的问题,请参考以下文章