欢迎来到天天文库
浏览记录
ID:44633482
大小:812.50 KB
页数:34页
时间:2019-10-24
《java-jvm虚拟机原理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、java虚拟机原理介绍目录Java虚拟机1.java虚拟机的生命周期2.java虚拟机的体系结构Javaclass文件1.magic(魔数)2.minor_version和major_version3.constant_pool_count和constant_pool类型的生命周期1.类型的装载、连接和初始化2.对象的生命周期3.卸载类型连接模型动态连接和解析垃圾收集Java虚拟机生命周期每运行一个java程序,便得到JAVA虚拟机的实例每个Java程序都运行于它自己的Java虚拟机实例中当程序关闭退出,这个虚拟
2、机实例也就随之消亡程序本身也能够通过调用Runtime类或者System类的exit()方法退出。Java虚拟机体系结构在Java假虚拟机规范中,一个虚拟机实例的行为时分别按照子系统、内存区、数据类型以及指令这几个术语来描述的。这些组成部分一起展示了抽象的虚拟机的内部抽象体系结构。1)所有的线程都共享方法区,方法区必须被设计为线程安全的,方法区大小不固定2)方法区存储以下类型信息:类的全限定名超类的全限定名是接口还是类类的访问修饰修饰符该类的【常量池】字段信息方法信息类(静态)变量:类变量是由所有类实例共享的,即
3、使没有类实例,也可以访问一个到类ClassLoader引用一个到类的引用3)方法表运行时数据区--方法区堆1)同一个java应用所有的线程共享堆空间(由于每一个java程序独占一个java虚拟机实例,因面每个java程序都有它自己的堆空间)堆空间可以分为三部分:一个Eden区,Survivor区和truned区2)由new操作符创建的对象均位于堆中运行时数据区—java中的堆运行时数据区--Java中的栈每启动一个新的线程,java虚拟机都会为它分配一个java栈,java栈上的都是此线程私有的每当启用一个线程时
4、,JVM就为他分配一个Java栈,栈是以帧为单位保存当前线程的运行状态。【当前方法,当前帧,当前类,当前常量池】每当线程调用一个Java方法时,JVM就会在该线程对应的栈中压入一个帧,这个帧自然就成了当前帧。当执行这个方法时,它使用这个帧来存储参数、局部变量、中间运算结果等等。Java栈上的所有数据都是私有的。任何线程都不能访问另一个线程的栈数据。Java栈和帧在内存中也不必是连续的,帧可以分布在连续的栈里,也可以分布在堆里栈帧栈帧由三部分组成:局部变量区、操作数栈和帧数据区Java的class文件Class文件
5、的内容在class文件中,可变长度项的大小和长度位于其实际数据之前,这个特性使得class文件数据流可以被顺序解析,首先读出项的大小,然后读出项数据1.magic(魔数)4个字节2.minor_version和major_version4个字节3.constant_pool_count和constant_pool4.access_flags2个字节5.this_class2个字节6.super_class2个字节7.interfaces_count和interfaces8.fields_count和fields9
6、.methods_count和fields10.attributes_count和attributesJava代码编译和执行的整个过程包含了以下三个重要的机制:1.Java源码编译机制2.类加载机制3.类执行机制Java代码编译是由Java源码编译器来完成,流程图如下所示:Java字节码的执行是由JVM执行引擎来完成,流程图如下所示:class文件由以下部分组成:1.结构信息包括class文件格式版本号及各部分的数量与大小的信息2.元数据对应于Java源码中声明与常量的信息。包含类/继承的超类/实现的接口
7、的声明信息、域与方法声明信息和常量池3.方法信息。对应Java源码中语句和表达式对应的信息。包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息Java中的类加载机制Java中的类加载机制JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:BootstrapClassLoader/启动类加载器$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类ExtensionClassLoa
8、der/扩展类加载器负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包AppClassLoader/系统类加载器负责加载classpath中指定的jar包及目录中classCustomClassLoader/用户自定义类加载器(java.lang.ClassLoader的子
此文档下载收益归作者所有