JVM简介
概述
-
有多种JVM,如Hot Spot、Dalvik和ART(Android)、Microsoft JVM等,可通过java –version查看,现在通常使用的是Hot Spot
-
.java的源代码通过编译成字节码后,会通过的类加载器加载进,然后执行,进行数据处理等操作(如下图,图来自网络)
类加载器(Class Loader)
-
负责将.class文件的字节码内容加载到内存,并将内容转换成方法区中的运行时数据结构
-
只负责加载,是否可运行,由执行引擎决定
-
类加载器按加载顺序由高到低分为4种:
- BootstrapClassLoader,根加载器,虚拟机自带,用于加载$JAVA_HOME/jre/lib/rt.jar包内的class文件,rt.jar是Java基础类库,包含Java运行环境所需的基础类,由C++实现
- ExtClassLoader ,拓展类加载器,虚拟机自带的加载器,用于加载$JAVA_HOME/jre/lib/ext/**.jar目录下的class文件
- AppClassLoader ,应用程序类加载器,虚拟机自带的加载器,用于加载当前应用的classpath的所有类,也就是我们自己写的那些Java代码
- 自定义加载器,可以通过继承Java.lang.ClassLoader抽象类自定义一个类加载器,多用于大型项目的版本冲突处理、热加载、字节码加密
-
双亲委派机制,保证优先加载基础类库;任何类的加载,都会先委托父类寻找指定的类加载器加载,形成一个链条,只有当链条中的某个类没有找到类加载器,才会让链条中的子层次中去寻找这一层次的类加载器;如此,可避免自定义的类会污染自带的基础类库
类加载器
-
(图片来自网络)
方法区
- 所有线程共享的一个运行时内存区域
- 可以理解为一种规范,不同的JVM实现有不同实现
- 存储了已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等
堆
- 一个JVM进程有且只有一个堆,所有线程共享
- 主要包含
- 新生代(Yong Generation),包括伊甸园区(Eden Space)和幸存者区(Survivor0和Survivor1)
- 老年代(Old Generation)
- 元空间(Meta Space)
- 堆大小可以在启动JVM时通过-Xms、Xmx等参数进行配置
- 垃圾回收机制(Garbage Collection)是针对新生代和老年代的堆内存空间进行回收
- 所有的非基本数据类型对象都活在堆中
栈
- 每个线程会创建一个栈,生命周期与线程一致,属于线程私有
- 主要用于保存局部变量、对象引用、操作数栈、动态链接和返回地址等
- 遵守FILO(First-In/Last-Out)规则,有入栈(Push)和出栈(Pop)操作
- 可在JVM启动时通过-Xss配置容量,超出容量时会抛出StackOverflowError异常
- Linux下的JVM默认大小一般是1024KB
程序计数器
- 每个线程有一个程序计数器,是线程私有
- 起到一个指针的作用,指向方法区中的方法字节码,存储当前线程的下一条指令地址
- 主要是解决CPU分时在不同的线程间切换,返回线程时,知道从什么地方继续执行
本地方法栈
- 用于管理本地接口的调用
本地接口
- 用于融合不同编程语言代码为Java所用,如C/C++
欢迎来到testingpai.com!
注册 关于