JVM简介
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
JVM 体系架构
JVM的实现原理
-
类装载器(ClassLoader)
主要负责加载class文件,是否能执行主要取决于(执行引擎)execution engine它是负责执行被加载类中包含的指令。有两种类加载器分别为启动类加载器和用户自定义类加载器,然而启动类加载器是JVM实现的一部分,用户自定义类加载器是Java程序一部分。-
虚拟机自带加载器
-
启动类(根)加载器 (BOOT)
-
扩展类加载器(ExtClassLoader)
-
应用程序(系统类)加载器(AppClassLoader)
此时就有一个双亲委派机制
//双亲委派机制->保证安全
APP->EXC->BOOT(最终执行)
流程:
-
类加载器收到类加载的请求
-
将这个请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器
-
启动类加载器监测是否能够加载当前这个类,能加载就结束,否则,抛出异常,通知子类加载器去执行加载
-
重复上
-
-
-
本地方法栈(native method stack)
主要作用是登记native方法,然后在execution engine执行的时候加载本地方法库。 -
栈(Stack)
又叫栈内存,负责Java程序的运行,它是在线程创建时创建的,所以生命周期也是和线程生命周期一致,同时消亡,线程结束了栈也就释放,特别提醒的是栈不存在垃圾回收的问题,因为线程结束栈就是释放了。平时我们写的类变量、引用类型变量、实例方法等等都是在函数的栈内存分配好。
-
程序计数器(Program Counter Register)
,是指方法区中的方法字节码由引擎读取下一条指令,它是一个非常小的内存空间。为什么有这种东西呢,大家都知道每个线程都是有一个程序计数器的,是线程私有的,相当一个指针。 -
方法区(Method Area)
它是指线程共享的,谁都可以共享使用,我们通常用来保存装载类的元结构信息。 -
堆(heap)
它是Java虚拟机用来存储对象实例的,比我们在开发过程使用的new对象,只要通过new创建的对象的内存的对象都在堆分配,注意一点的是堆中的对象内存需要等待垃圾器(GC)进行回收,也是Java虚拟机共享区。 -
本地接口(native interface)
作用是融合不同的编程语言为Java所用,注意底层是C、C++写的,这个方法的行为就是native method stack中登记native方法,然后在execution engine执行时加载native libraries的。一般有native的java方法 是java已经无法处理了 而去调用底层的C去操作。GC垃圾回收
GC首先要知道GC的作用域是在方法区(method area)和堆(heap)的GC垃圾回收它是Java核心技术,它是怎么实现的呢,主要通过确定对象引用来判断是否收集该对象,我们平时常用的方法引用计数和对象引用便利两种方法的,GC收集的算法后续更新。
注意:本文归作者所有,未经作者允许,不得转载