欢迎来到天天文库
浏览记录
ID:30779108
大小:135.54 KB
页数:8页
时间:2019-01-03
《java虚拟机结构分析-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、hva虚拟机结构分析・编程开发技术Java虚拟机结构分析原文出处:朱小厮本博文主要介绍了JVM(Java?VirtualMachine)的组成部分以及它们内部的工作机制和原理。需要注意的是,虽然平时我们用的大多是Sim(现已被Oracle收购)JDK捉供的JVM,但是JVM本身是一个规范,所以可以冇多种实现,除了Hotspot外,还有诸$0Oracle的JRockit、IBM的J9也都是非常有名的JVM。1.结构卜•图展示了JVM的主要结构:CLASSLOADERCLASSFILESNZVTIVELIBRARIESEXECUTIONENGIN
2、ENATIVE[NTERECE
3、
4、RUNTIMEDATAAREASSHAREDAMONGALLTHREADS
5、
6、THREADSPEQFICRUNTIMEDATAAREAS可以看出,JVM主要由类加载器子系统、运行时数据区(内存空间)、执行引擎以及与本地方法接口等组成。其中运行时数据区又由方法区、堆、Java栈、PC寄存器、本地方法栈组成。从上图屮还可以看岀,在内存空间中方法区和堆是所有Java线程共享的,而Java栈、本地方法栈、PC寄存器则由每个线程私有,这会引出一些问题,后文会进行具体讨论。众所周知,Jova语言具有跨平台的特性,这也是由
7、JVM来实现的。更准确地说,是Sun利用JVM在不同平台上的实现帮我们把平台相关性的问题给解决了,这就好比是HTML语言可以在不同厂商的浏览器上呈现元素(虽然某些浏览器在对W3C标准的支持上还冇一些问题)。同时,Java语言支持通过JN1(JavaNativeInterface)来实现本地方法的调用,但是需要注意到,如果你在Java程序用调用了木地方法,那么你的程序就很可能不再具有跨平台性,即木地方法会破坏平台无关性。2・类加载器子系统(ClassLoader)类加载器子系统负责加载编译好的.class字节码文件,并装入内存,使JVM可以实例
8、化或以其它方式使用加载后的类。JVM的类加载子系统支持在运行时的动态加载,动态加载的优点有很多,例如可以节省内存空间、灵活地从网络上加载类,动态加载的另一好处是可以通过命名空间的分隔來实现类的隔离,增强了整个系统的安全性。2.1ClassLoader的分类•启动类加载器(BootstrapClassLoader):负责加载rt.jai•文件中所有的Java类,即Java的核心类都是由该ClassLoader加载。在SunJDK中,这个类加载器是由C++实现的,并且在Java语言屮无法获得它的引用。•扩展类加载器(ExtensionClassL
9、oader):负责加载一些扩展功能的jar包。•系统类加载器(SystemClassLoader):负责加载启动参数中指定的Classpath中的jar包及目录,通常我们自己写的Java类也是由该ClassLoader加载。在SunJDK中,系统类加载器的名字叫AppClassLoader。•用户自定义类加载器(UserDefinedClassLoader):由用八B定义类的加载规贝U,可以手动控制加载过程中的步骤。2.2ClassLoader的工作原理类加载分为装载、链接、初始化三步。2.2.1装载通过类的全限定名和ClassLoader加
10、载类,主要是将指定的.class文件加载至JVMo当类被加载以后,在JVM内部就以“类的全限定名+ClassLoader实例ID”来标明类。在内存中,ClassLoader实例和类的实例都位于堆中,它们的类信息都位于方法区。装载过程采用了一种被称为“双亲委派模型(ParentDelegationModel)的方式,当一个ClassLoader要加载类时,它会先请求它的双亲ClassLoader(其实这里只有两个ClassLoader,所以称为父ClassLoader可能更容易理解)加载类,而它的双亲ClassLoader会继续把加载请求提交再
11、上一级的ClassLoader,直到启动类加载器。只冇英双亲ClassLoader无法加载指定的类时,它才会自己加载类。双亲委派模型是JVM的第一道安全防线,它保证了类的安全加载,这里同吋依赖了类加载器隔离的原理:不同类加载器加载的类之间是无法直接交互的,即使是同一个类,被不同的ClassLoader加载,它们也无法感知到彼此的存在。这样即使有恶意的类冒充自己在核心包(例如java,lang)下,由于它无法被启动类加载器加载,也造成不了危害。由此也可见,如果用户自定义了类加载器,那就必须自己保障类加载过程中的安全。2.2.2链接链接的任务是把
12、二进制的类型信息合并到JVM运行时状态屮去。链接分为以下三步:1.验证:校验.class文件的正确性,确保该文件是符合规范定义的,并H适合当前JVM使用。2.准备:
此文档下载收益归作者所有