JVM底层实现与总结

一、类加载器

  1.BootstrapClassLoader(启动类加载器)

   它主要负责加载%JAVA_HOME%/jre/lib,-Xbootclasspath参数指定的路径以及%JAVA_HOME%/jre/classes中的类。

   2.ExtensionClassLoader  (扩展类加载器)

   ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext,此路径下的所有classes目录以及java.ext.dirs系统变量指定的路径中类库。

   3.AppClassLoader 

   AppClassLoader主要负责加载classpath所指定的位置的类或者是jar文档,它也是Java程序默认的类加载器。

  他们之间为父子类关系,由于存在双亲委托机制,使用户无法替换JDK本身的类。

  此外可以用户自定义加载类,定义自已的类加载器分为两步:1、继承java.lang.ClassLoader2、重写父类的findClass方法。

       classloader的作用是将字节码文件读取到内存,是JVM的入口

二、执行引擎(Execution Engine)

  执行引擎的作用是解释命令,提交给操作系统执行

三、本地方法栈(线程私有)

  通过执行native方法,通过本地方法接口调用本地方法库

四、程序计数器(线程私有)

  可看做是指针,指向方法区的字节码(即下条指令的地址),内存很小

五、虚拟机栈(线程私有)

  生命周期与线程一致。8种基本类型变量,对象的引用变量,实例方法都是在函数的栈内存分配,主要保存三种数据:

    1.本地变量:输入输出参数、方法内变量

    2.栈操作 :出栈、入栈等操作

    3.栈帧数据:类文件、方法等

六、方法区(线程共享)

  用于储存静态变量、常量、类信息(构造函数/接口定义)、运行时常量池。

   虽然Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java 堆区分开来。

七、堆(线程共享)

  一个JVM对应着一个堆,用于存放对象实例。可以通过参数-Xms-Xmx来控制。默认1/64和1/4

  

  

猜你喜欢

转载自www.cnblogs.com/Noctis/p/10920305.html