版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、淘宝技术大学 应届生培训 JVM工作原理课程组:雷卷 小邪 九穆版本:第一版2009年达到的目目标知道Java虚拟机的的生存周周期知道JVM的体系结结构知道JVM体系结构构中的各各个部分分能对JVM有个大致致清晰的的了解内容JVM的生命周周期JVM的体系结结构JVM类加载器器JVM执行引擎擎JVM运行时数数据区JVM垃圾回收收问题JVM的生命周周期一、首先先分析两两个概念念JVM实例和JVM执行引擎擎实例(1)JVM实例对应应了一个个独立运运行的java程序它是进程程级别(2)JVM执行引擎擎实例则则对应了了属于用用户运行行程序的的线程它是线程程级别的的JVM的生命周周期二、JVM的生命周周期
2、(1)JVM实例的诞诞生当启动一一个Java程序时,一个JVM实例就产产生了,任何一一个拥有有publicstatic voidmain(Stringargs)函数的class都可以作作为JVM实例运行行的起点点(2)JVM实例的运运行main()作为该程程序初始始线程的的起点,任何其其他线程程均由该该线程启启动。JVM内部有两两种线程程:守护护线程和和非守护护线程,main()属于非守守护线程程,守护护线程通通常由JVM自己使用用,java程序也可可以标明明自己创创建的线线程是守守护线程程。(3)JVM实例的消消亡当程序中中的所有有非守护护线程都都终止时时,JVM才退出;若安全全管理器器允许
3、,程序序也可以以使用Runtime类或者System.exit()来退出。内容JVM的生命周周期JVM的体系结结构JVM类加载器器JVM执行引擎擎JVM运行时数数据区JVM垃圾回收收问题JVM的体系结结构JVM的体系结结构一、JVM的内部体体系结构构分为三三部分,(1)类装载载器(ClassLoader)子系统统作用:用来装载载.class文件(2)执行引引擎作用:执行字节节码,或或者执行行本地方方法(3)运行时时数据区区方法区,堆,java栈,PC寄存器,本地方方法栈内容JVM的生命周周期JVM的体系结结构JVM类加载器器JVM执行引擎擎JVM运行时数数据区JVM垃圾回收收问题JVM的体系结
4、结构之类类加载器器一、JVM将整个类类加载过过程划分分为了三三个步骤骤:(1)装载装载过程程负责找找到二进进制字节节码并加加载至JVM中,JVM通过类名名、类所所在的包包名通过过ClassLoader来完成类类的加载载,同样样,也采采用以上上三个元元素来标标识一个个被加载载了的类类:类名名+包名+ClassLoader实例ID。(2)链接链接过程程负责对对二进制制字节码码的格式式进行校校验、初初始化装装载类中中的静态态变量以以及解析析类中调调用的接接口、类类。在完成了了校验后后,JVM初始化类类中的静静态变量量,并将将其值赋赋为默认认值。最后一步步为对类类中的所所有属性性、方法法进行验验证,以
5、以确保其其需要调调用的属属性、方方法存在在,以及及具备应应的权限限(例如如public、private域权限等等),会会造成NoSuchMethodError、NoSuchFieldError等错误信信息。(3)初始化化初始化过过程即为为执行类类中的静静态初始始化代码码、构造造器代码码以及静静态属性性的初始始化,在在四种情情况下初初始化过过程会被被触发执执行:调用了new;反射调调用了类类中的方方法;子子类调用用了初始始化;JVM启动过程程中指定定的初始始化类。JVM的体系结结构之类类加载器器JVM的体系结结构之类类加载器器一、JVM两种类装装载器包包括:启启动类装装载器和和用户自自定义类类装
6、载器器,启动动类装载器是JVM实现的一一部分,用户自自定义类类装载器器则是Java程序的一一部分,必须是是ClassLoader类的子类类。二、主主要分为为以下几几类:(1)Bootstrap ClassLoader这是JVM的根ClassLoader,它是用用C+实现的,JVM启动时初初始化此此ClassLoader,并由此此ClassLoader完成$JAVA_HOME中jre/lib/rt.jar(SunJDK的实现)中所有有class文件的加加载,这这个jar中包含了了java规范定义义的所有有接口以以及实现现。(2)Extension ClassLoaderJVM用此classloa
7、der来加载扩扩展功能能的一些些jar包(3)System ClassLoaderJVM用此classloader来加载启启动参数数中指定定的Classpath中的jar包以及目目录,在在SunJDK中ClassLoader对应的类类名为AppClassLoader。(4)User-Defined ClassLoaderUser-DefinedClassLoader是Java开发人员员继承ClassLoader抽象类自自行实现现的ClassLoader,基于自自定义的的ClassLoader可用于加加载非Classpath中的jar以及目录录JVM的体系结结构之类类加载器器三、ClassLoa
8、der抽象类提提供了几几个关键键的方法法:(1)loadClass此方法负负责加载载指定名名字的类类,ClassLoader的实现方方法为先先从已经经加载的的类中寻寻找,如如没有则则继续从从parentClassLoader中寻找,如仍然然没找到到,则从从SystemClassLoader中寻找,最后再再调用findClass方法来寻寻找,如如要改变变类的加加载顺序序,则可可覆盖此此方法(2)findLoadedClass此方法负负责从当当前ClassLoader实例对象象的缓存存中寻找找已加载载的类,调用的的为native的方法。(3)findClass此方法直直接抛出出ClassNotFo
9、undException,因此需需要通过过覆盖loadClass或此方法法来以自自定义的的方式加加载相应应的类。(4)findSystemClass此方法负负责从SystemClassLoader中寻找类类,如未未找到,则继续续从BootstrapClassLoader中寻找,如仍然然为找到到,则返返回null。(5)defineClass此方法负负责将二二进制的的字节码码转换为为Class对象(6)resolveClass此方法负负责完成成Class对象的链链接,如如已链接接过,则则会直接接返回。JVM的体系结结构之类类加载器器四、简单单的classLoader例子/* 重写写ClassLo
10、ader类的findClass方法,将将一个字字节数组组转换为为Class类的实例例*/publicClassfindClass(Stringname)throwsClassNotFoundExceptionbyteb= null;tryb =loadClassData(AutoClassLoader.FormatClassName(name);catch(Exception e) e.printStackTrace();returndefineClass(name,b,0,b.length);/* 将指指定路径径的.class文件转换换成字节节数组*/private byteloadClas
11、sData(Stringfilepath)throws Exceptionintn=0;BufferedInputStream br =newBufferedInputStream(newFileInputStream(newFile(filepath);ByteArrayOutputStreambos=newByteArrayOutputStream();while(n=br.read()!=-1)bos.write(n);br.close();returnbos.toByteArray();JVM的体系结结构之类类加载器器四、简单单的classLoader例子 /* 格式式化文件件所对应应
12、的路径径*/publicstatic StringFormatClassName(String name)FILEPATH=DEAFAULTDIR+name+.class;returnFILEPATH;/* main方法测试试*/publicstatic voidmain(Stringargs)throwsException AutoClassLoaderacl =newAutoClassLoader();Classc =acl.findClass(testClass);Objectobj =c.newInstance();Methodm=c.getMethod(getName,newClas
13、sString.class,int.class);m.invoke(obj,你好,123);System.out.println(c.getName();System.out.println(c.getClassLoader();System.out.println(c.getClassLoader().getParent();内容JVM的生命周周期JVM的体系结结构JVM类加载器器JVM执行引擎擎JVM运行时数数据区JVM垃圾回收收问题JVM的体系结结构之执执行引擎擎一、JVM通过执行行引擎来来完成字字节码的的执行,在执行行过程中中JVM采用的是是自己的的一套指指令系统统,每个线程程在创建建
14、后,都都会产生生一个程程序计数数器(pc)和栈(Stack),其中中程序计计数器中中存放了了下一条条将要执执行的指指令,Stack中存放StackFrame,表示的的为当前前正在执执行的方方法,每每个方法法的执行行都会产产生StackFrame,StackFrame中存放了了传递给给方法的的参数、方法内内的局部部变量以以及操作作数栈,操作数数栈用于于存放指指令运算算的中间间结果,指令负负责从操操作数栈栈中弹出出参与运运算的操操作数,指令执执行完毕毕后再将将计算结结果压回回到操作作数栈,当方法法执行完完毕后则则从Stack中弹出,继续其其他方法法的执行行。在执行方方法时JVM提供了invokes
15、tatic、invokevirtual、invokeinterface和invokespecial四种指令令来执行行(1)invokestatic:调用类类的static方法(2)invokevirtual: 调用用对象实实例的方方法(3)invokeinterface:将属性性定义为为接口来来进行调调用(4)invokespecial:JVM对于初始始化对象象(Java构造器的的方法为为:)以及调调用对象象实例中中的私有有方法时时。 JVM的体系结结构之执执行引擎擎二、反射射机制是是Java的亮点之之一,基基于反射射可动态态调用某某对象实实例中对对应的方方法、访访问查看看对象的的属性等等,而
16、无无需在编编写代码码时就确确定需要要创建的的对象,这使得得Java可以实现现很灵活活的实现现对象的的调用,代码示示例如下下:ClassactionClass=Class.forName(外部实现现类);Methodmethod=actionClass.getMethod(“execute”,null);Objectaction=actionClass.newInstance();method.invoke(action,null);反射的关关键:要要实现动动态的调调用,最最明显的的方法就就是动态态的生成成字节码码,加载载到JVM中并执行行 JVM的体系结结构之执执行引擎擎(1)Classact
17、ionClass=Class.forName(外部实现现类);调用本地地方法,使用调调用者所所在的ClassLoader来加载创创建出Class对象;(2)Methodmethod=actionClass.getMethod(“execute”,null);校验此Class是否为public类型的,以确定定类的执执行权限限,如不不是public类型的,则直接接抛出SecurityException;调用privateGetDeclaredMethods来获取到到此Class中所有的的方法,在privateGetDeclaredMethods对此Class中所有的的方法的的集合做做了缓存存,在第
18、第一次时时会调用用本地方方法去获获取;扫描方法法集合列列表中是是否有相相同方法法名以及及参数类类型的方方法,如如有则复复制生成成一个新新的Method对象返回回;如没有则则继续扫扫描父类类、父接接口中是是否有此此方法,如仍然然没找到到方法则则抛出NoSuchMethodException;JVM的体系结结构之执执行引擎擎(3)Objectaction=actionClass.newInstance();第一步:校验此此Class是否为public类型,如如权限不不足则直直接抛出出SecurityException;第二步:如没有有缓存的的构造器器对象,则调用用本地方方法获取取到构造造器,并并复
19、制生生成一个个新的构构造器对对象,放放入缓存存,如没没有空构构造器则则抛出InstantiationException;第三步:校验构构造器对对象的权权限;第四步:执行构构造器对对象的newInstance方法;构构造器对对象的newInstance方法判断断是否有有缓存的的ConstructorAccessor对象,如如果没有有则调用用sun.reflect.ReflectionFactory生成新的的ConstructorAccessor对象;第五步:sun.reflect.ReflectionFactory判断是否否需要调调用本地地代码,可通过过sun.reflect.noInflati
20、on=true来设置为为不调用用本地代代码,在在不调用用本地代代码的情情况下,就转交交给MethodAccessorGenerator来处理了了;第六步:MethodAccessorGenerator中的generate方法根据据Java Class格式规范范生成字字节码,字节码码中包括括了ConstructorAccessor对象需要要的newInstance方法,此此newInstance方法对应应的指令令为invokespecial,所需的的参数则则从外部部压入,生成的的Constructor类的名字字以:sun/reflect/GeneratedSerializationConstru
21、ctorAccessor或sun/reflect/GeneratedConstructorAccessor开头,后后面跟随随一个累累计创建建的对象象的次数数;第七步:在生成成了字节节码后将将其加载载到当前前的ClassLoader中,并实实例化,完成ConstructorAccessor对象的创创建过程程,并将将此对象象放入构构造器对对象的缓缓存中;最后一步步:执行行获取的的constructorAccessor.newInstance,这步和和标准的的方法调调用没有有任何区区别。JVM的体系结结构之执执行引擎擎(4)method.invoke(action,null);这步执行行的过程程和上
22、一一步基本本类似,只是在在生成字字节码时时生成的的方法改改为了invoke,其调用用的目标标改为了了传入的的对象的的方法,同时生生成的类类名改为为了:sun/reflect/GeneratedMethodAccessor。注:但是是getMethod是非常耗耗性能的的,一方方面是权权限的校校验,另另外一方方面所有有方法的的扫描以以及Method对象的复复制,因因此在使使用反射射调用多多的系统统中应缓缓存getMethod返回的Method对象JVM的体系结结构之执执行引擎擎2、执行技技术主要的执执行技术术有:解释,即即时编译译,自适适应优化化、芯片片级直接接执行(1)解释属属于第一一代JVM,
23、(2)即时编编译JIT属于第二二代JVM,(3)自适应应优化(目前Sun的HotspotJVM采用这种种技术)则吸取取第一代代JVM和第二代代JVM的经验,采用两两者结合合的方式式(4)自适应应优化:开始对对所有的的代码都都采取解解释执行行的方式式,并监监视代码码执行情情况,然然后对那那些经常常调用的的方法启启动一个个后台线线程,将将其编译译为本地地代码,并进行行仔细优优化。若若方法不不再频繁繁使用,则取消消编译过过的代码码,仍对对其进行行解释执执行。内容JVM的生命周周期JVM的体系结结构JVM类加载器器JVM执行引擎擎JVM运行时数数据区JVM垃圾回收收问题JVM的体系结结构之运运行时数数
24、据区一、JVM在运行时时将数据据划分为为了6个区域来来存储,而不仅仅仅是大大家熟知知的Heap区域,这这6个区域图图示如下下:JVM的体系结结构之运运行时数数据区第一块:PC寄存器PC寄存器是是用于存存储每个个线程下下一步将将执行的的JVM指令,如如该方法法为native的,则PC寄存器中中不存储储任何信信息。第二块:JVM栈JVM栈是线程程私有的的,每个个线程创创建的同同时都会会创建JVM栈,JVM栈中存放放的为当当前线程程中局部部基本类类型的变变量(java中定义的的八种基基本类型型:boolean、char、byte、short、int、long、float、double)、部分分的返回
25、回结果以以及StackFrame,非基本本类型的的对象在在JVM栈上仅存存放一个个指向堆堆上的地地址第三块:堆(Heap)Heap是大家最最为熟悉悉的区域域,它是是JVM用来存储储对象实实例以及及数组值值的区域域,可以以认为Java中所有通通过new创建的对对象的内内存都在在此分配配,Heap中的对象象的内存存需要等等待GC进行回收收。JVM的体系结结构之运运行时数数据区JVM将Heap分为NewGeneration和OldGeneration(或Tenured Generation)两块来来进行管理理:(1)NewGeneration又称为新新生代,程序中中新建的的对象都都将分配配到新生生代
26、中,新生代代又由Eden Space和两块SurvivorSpace构成,可可通过-Xmn参数来指指定其大大小(2)OldGeneration又称为旧旧生代,用于存存放程序序中经过过几次垃垃圾回收收还存活活的对象象,例如如缓存的的对象等等,旧生生代所占占用的内内存大小小即为-Xmx指定的大大小减去去-Xmn指定的大大小。JVM的体系结结构之运运行时数数据区对堆的解解释:(1)堆是JVM中所有线线程共享享的,因因此在其其上进行行对象内内存的分分配均需需要进行行加锁,这也导导致了new对象的开开销是比比较大的的(2)鉴于上上面的原原因,SunHotspotJVM为了提升升对象内内存分配配的效率率,
27、对于于所创建建的线程程都会分分配一块块独立的的空间,这块空空间又称称为TLAB(ThreadLocalAllocationBuffer),其大大小由JVM根据运行行的情况况计算而而得,在在TLAB上分配对对象时不不需要加加锁,因因此JVM在给线程程的对象象分配内内存时会会尽量的的在TLAB上分配,在这种种情况下下JVM中分配对对象内存存的性能能和C基本是一一样高效效的,但但如果对对象过大大的话则则仍然是是直接使使用堆空空间分配配(3)TLAB仅作用于于新生代代的Eden Space,因此在在编写Java程序时,通常多多个小的的对象比比大的对对象分配配起来更更加高效效,但这种方方法同时时也带来来
28、了两个个问题,一是空空间的浪浪费,二二是对象象内存的的回收上上仍然没没法做到到像Stack那么高效效,同时时也会增增加回收收时的资资源的消消耗,可可通过在在启动参参数上增增加-XX:+PrintTLAB来查看TLAB这块的使使用情况况。JVM的体系结结构之运运行时数数据区第四块:方法区区域(MethodArea)(1)方法区区域存放放了所加加载的类类的信息息(名称称、修饰饰符等)、类中中的静态态变量、类中定定义为final类型的常常量、类类中的Field信息、类类中的方方法信息息,当开开发人员员在程序序中通过过Class对象中的的getName、isInterface等方法来来获取信信息时,这
29、些数数据都来来源于方方法区域域,可见见方法区区域的重重要性,同样,方法区区域也是是全局共共享的,在一定定的条件件下它也也会被GC,当方法法区域需需要使用用的内存存超过其其允许的的大小时时,会抛抛出OutOfMemory的错误信信息。(2)在SunJDK中这块区区域对应应的为PermanetGeneration,又称为为持久代,默认为为64M,可通过过-XX:PermSize以及-XX:MaxPermSize来指定其其大小。第五块:运行时时常量池池(Runtime Constant Pool)类似C中的符号号表,存存放的为为类中的的固定的的常量信信息、方方法和Field的引用信信息等,其空间间从
30、方法法区域中中分配。第六块:本地方方法堆栈栈(NativeMethod Stacks)JVM采用本地地方法堆堆栈来支支持native方法的执执行,此此区域用用于存储储每个native方法调用用的状态态。内容JVM的生命周周期JVM的体系结结构JVM类加载器器JVM执行引擎擎JVM运行时数数据区JVM垃圾回收收问题JVM的体系结结构之内内存回收收一、JVM中自动的的对象内内存回收收机制称称为:GC(Garbage Collection)1、GC的基本原原理:为将内存存中不再再被使用用的对象象进行回回收,GC中用于回回收内存存中不被被使用的的对象的的方法称称为收集集器,由由于GC需要消耗耗一些资资
31、源和时时间的,Java在对对象象的生命命周期特特征进行行分析后后,在V 1.2以上的版版本采用用了分代代的方式式来进行行对象的的收集,即按照照新生代代、旧生生代的方方式来对对对象进进行收集集,以尽尽可能的的缩短GC对应用造造成的暂暂停(1)对新生生代的对对象的收收集称为为minorGC,(2)对旧生生代的对对象的收收集称为为Full GC,(3)程序中中主动调调用System.gc()强制执行行的GC为Full GC,JVM的体系结结构之内内存回收收二、JVM中自动内内存回收收机制(1)引用计计数收集集器原理:引用计数数是标识识Heap中对象状状态最明明显的一一种方法法,引用用计数的的方法简简单来说说就是对对每一个个对象都都提供一一个关联联的引用用计数,以此来来标识该该对象是是否被使使用,当当这个计计数为零零时,说说明这个个对象已已经不再再被
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年物业管理与维护合作协议3篇
- 2024新媒体项目协作协议简约版版B版
- 2024年货物销售合同协议书
- 2024年物业维修服务协议(含装修)3篇
- 2024微信小程序功能定制开发服务合同3篇
- 2024年股权转让协议(复杂版)
- 2024政府与华为签订的环保产业合作协议3篇
- 2024年货车非官方过户销售协议书版
- 2024新型智能家居产品研发与技术服务协议
- 2024年艺人经纪公司与艺人独家代理合同
- 黑布林英语A Test for Jess教学设计-刘明
- 一监区服装生产管理问题
- 人教PEP版英语四年级上册单词表默写(英译汉、汉译英)
- 职业健康监护技术规范
- 水不同温度的热焓值
- 小品剧本《超级招聘》
- 空气压缩机检验原始记录表
- 叉车部件的涂装工艺及体系
- DB32∕T 3261-2017 水利工程预拌混凝土应用技术规范
- 物理学习的8种思考方式
- 中国风围棋对弈雅致文艺教育培训活动策划版
评论
0/150
提交评论