JVM的组成

来源:互联网 发布:js jsonarray清空 编辑:程序博客网 时间:2024/05/24 06:45
1、类加载器
1)启动类加载器负责加载JDK中的核心类库
扩展类加载器:负责加载java的扩展类库
系统类加载器:负责加载classpath下的所有jar和class文件
2)、类加载器使用的是双亲委托机制,当一个ClassLoader要加载一个实例时,先委托给他的
父类加载器,即启动类加载器,(启动类加载器本身没有父类加载器,但他可以作为其他
类的父类加载器),当启动类加载器没有加载到,就会委托扩展类加载器进行加载,如果还没
加载到,就会委托给系统类加载器进行加载,如果还没加载到,就会让发起该委托的
ClassLoader自己加载,如果没有加载到,就会抛出ClassNotFoundException异常。使用双亲
委托机制可以避免重复加载
2、执行引擎:负责执行class文件中字节码指令
3、1)内存区(全局共享):包括常量池,静态变量,构造函数
2)java堆(全局共享):存储java实例或者对象,也是GC的主要区域
注意:a. java堆可以分为新生代和老生代,新生代中会有大批的对象死去,存活率低,使用
复制算法;而老生代的对象存活率较高,使用标记-清理算法。b.当前大多数虚拟机都按照可
扩展来实现的,通过-xmx和-xms来控制。c.该区域会抛出的异常:OutofMemeryError异常,
堆中没有内存完成实例分配,并且堆无法再扩展,就会抛出此异常
3)java栈(线程独有):java栈总是和线程关联在一起,每次创建一个线程时,JVM就会为这
个线程创建一个java栈,栈里面有栈帧,每运行一个方法就会创建一个栈帧,用于存储局部
变量,操作栈,方法返回值等,每一个方法从调用到执行结束的过程就对应一个栈帧从进栈
到出栈的过程,所以java栈是线程独有的
注意:该区域会发生两种异常:a、StackoverflowError异常,如果线程请求的栈深度大于虚
拟机所允许的深度,将抛出此异常。场景:比如你写一个递归方法,就有可能导致栈溢出
b.OutofMemeryError异常,当前大部分的java虚拟机都可以动态的扩展,如果扩展时无法申
请到足够的内存,将抛出此异常。
4)本地方法栈(线程独有):和java栈差不多,主要是为JVM使用到的native方法执行的
5)程序计数器(线程独有):用于保存当前线程执行的内存地址,由于JVM是多线程轮流执行
的,所以为了保证线程切换回来后,还能恢复到原来的状态,就需要一个程序计数器,记录
之前中断的地方,所以它也是线程独有的。分支、循环、跳转、异常处理、线程恢复都依靠
它来完成
注意:如果线程正在执行的是一个Java方法,这计数器记录的是正在执行的虚拟机字节码指
令地址,如果正在执行的是Native方法,这个计数器则为空(undefined)。.此区域是JVM唯
一一个没有规定任何OutOfMermoryError的情况区域 
原创粉丝点击