JVM
三种JVM
Sun公司的HotSpot
BEA公司的JRockit
https://baike.baidu.com/item/JRockit/5079300
IBM公司的J9 VM
http://book.51cto.com/art/201306/399155.htm
JVM虚拟机架构
重点
类加载器
类加载器过程
- 类加载器子系统负责从文件系统或者网络中加载Class文件,Class文件在文件开头有特定的文件标识
- ClassLoader只负责Class文件的加载,至于他是否可以运行,则由ExecutionEngine决定。
- 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还会包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)
类加载器ClassLoader角色
类加载过程
a.加载
获取class文件加载成二进制字节流
把改文件的编码结构----->运行时的内存结构
在内存中生成该类的一个Class对象
jclasslib-bytecode-viewer
b.连接
验证:保证加载类的一个正确性
准备:为类变量分配内存 设置类变量的初始值
解析:相当于翻译过程
初始化
初始化节点就是执行类构造器的过程
不同于构造器
收集静态变量赋值和静态代码块
类加载器的分类(重点)
-
JVM支持两种类型的类加载器,分别是引导类加载器(Bootsrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)。
-
从概念上,自定义类加载器一般指的是程序由开发人员自定义的一类类加载器,但是Java虚拟器规范却没有这么定义,而是将所有派生于抽象类的ClassLoader都划分为自定义类加载器。
-
无论加载器的类型如何划分,在程序中我们最常见的类加载器始终只有3个,如下所示:
虚拟机自带的加载器: -
启动类加载器(引导类加载器,Bootstrap ClassLoader)
-
扩展类加载器(Extension ClassLOader)
-
应用程序类加载器(系统类架子阿奇,ApplicationClassLoader)
-
用户自定义类加载器
用户自定义类加载器实现步骤1.开发人员可以通过继承抽象类java.lang.ClassLoader类的方式,实现自己的类加载器,以满足一些特殊的需求 2.在JDK1.2之前,在定义类加载器时,总会去继承ClassLoader类并重写loadcClass()方法,从而实现自定义的类加载 类,但是在JDK1.2之后已不再建议用户去覆盖loadClass()方法,而是建议把自定义的类加载逻辑写在findClass()方法中 3.在编写自定义类加载器时,如果没有太过于复杂的需求,可以直接继承URLClassLoader类,这样就可以避免自己去编写findClass()方法机器获取字节码流的方式,使自定义类加载器编写更加间接。
双亲委派机制
Java虚拟机对class文件采用的是按需加载的方式,也就是当需要使用该类时才会讲他的class文件加载到内存生成class对象,而且家在某个类的class文件,Java虚拟机采用的是双亲委派模式,即吧请求交给父类处理,它是一种任务委派模式。
优势
- 避免类的重复加载
- 保护程序安全,防止核心API被随意篡改
- 自定义类;java.lang.String
- 自定义类:java.lang.ShkStart
沙箱安全机制
运行时数据区内部结构
内部整体结构
PC寄存器
JVM中的一种程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的线程信息,CPU只有把数据装载到寄存器才能运行。
JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟器,并非真实的寄存器。
作用: PC寄存器用来存储指向下一条指令的地址,也即将执行的指令代码。由执行引擎读取下一条指令。
本地方法
本地方法
a.概念: java调用非java的那些代码接口
b.作用:与java外界进行交互
c.本地方法栈: 用来管理本地方法的结构
本地方栈
虚拟机栈
基本概念
栈式运行时的单位,而堆是存储的单位。
作用:
主管Java程序的运行,它保存方法的局部变量(八种基本数据类型、对象的引用地址)、部分结果,并参与方法的调用和返回
栈帧
概念
每个线程都有自己的栈,栈中的数据以栈帧格式存在,每个方法对应一个栈帧
存储内容
栈运行原理
组成部分–局部变量表
组成部分–操作数栈
堆空间
核心概述
基本概念
插件安装![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fba04fb4d5550b580da47e788153e701.png)
栈内存细分
组成部分
OOM内存溢出
新生代和老年代