1.JVM的位置
JVM《----》操作系统(Windows,Linux,Mac)《----》 硬件
程序运行流程:
编写".java"文件,转换成class文件,通过类加载器,到JVM(几个要素),执行引擎与Jvm进行交互,执行引擎包含了解释器、JIT编译器,垃圾回收器等,本地方法库通过本地方法接口(JNI)与JVM进行交互
JVM中栈,本地方法栈,程序计数器中不会产生垃圾,也就不会有垃圾回收操作
2.JVM调优方法
几乎都在JVM中堆区域进行优化(略过暂时)
3.类加载器
作用:加载class文件
1).虚拟器自带的加载器
2).启动类(根)加载器 Bootstrap classLoader
3).扩展类加载器 ExtClassLoader //jre/lib/ext
4).应用程序(系统类)加载器 appClassLoader
双亲委派机制:安全
- 避免类的重复加载
- 保护程序安全,防止核心API被随意篡改
↓↓↓原理:
1…类加载器收到类加载请求
2.将这个请求先从app加载器向上委托给父类加载器去完成,一直向上委托,直到启动类加载器(Bootstrap)
3.启动类(根)加载器检查是否能够加载这个类,能加载就结束,使用当前的加载器,通知子加载器进行加载,如果都找不到,就会抛出异常(ClassNotFoundException )
4.沙箱安全机制
基本组成:
字节码校验器
类装载器:存储控制器、安全管理器 、安全软件包(安全提供者、消息摘要、数字签名keytools、加密、鉴别)
5.Native
本地方法栈与栈类似,也是用来保存执行方法的信息.执行Java方法时使用栈,执行Native方法时使用本地方法栈.
带有Native关键字的,Java的作用范围就达不到,会去调用底层c语言的库,进入本地方法栈,调用本地方法接口(Java Native Interference JNI)
JNI作用:扩展Java的使用,融合不同的编程语言为Java所用
Java程序驱动打印机,管理系统等用Native方法,很少用现在
6.程序计数器
保存着当前线程执行的字节码位置,每个线程工作时都有独立的计数器,只为执行Java方法服务,执行
Native方法时,程序计数器为空.
7.方法区
又称非堆区,用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器优化后的代码等数据
.1.7的永久代和1.8的元空间都是方法区的一种实现
8.栈
又称方法栈,是线程私有的,线程执行方法时都会创建一个栈帧,用来存储局部变量表,操作数栈,
动态链接,方法出口等信息.调用方法时执行入栈,方法返回时执行出栈.
三种JVM
1)sun公司,HotSpot
2)BEA ,JRockit
3)IBM, J9VM
9.堆
JVM内存管理最大的一块,堆被线程共享,目的是存放对象的实例,几乎所有的对象实例都会放在这里,当堆 没有可用空间时,会抛出OOM异常.根据对象的存活周期不同,JVM把对象进行分代管理,由垃圾回收器进行 垃圾的回收管理
Heap,一个JVM只有一个堆内存,堆内存的大小是可以调节的
堆内存细分为三个区域:
1)新生区(伊甸园区)——》伊甸园区、幸存区0区、幸存区1区
2)养老区
3)永久区:这个区域常驻内存的,用来存放JDK自身携带的Class对象,Interface元数据,存储 的是Java运行时的一些环境或类信息,这个区域不存在垃圾回收,关闭JVM虚拟就会释放这个区域的内存
GC垃圾回收,主要在伊甸园区和养老区
堆内存不够,会OOM异常
jdk1.8之后元空间:逻辑上存在,物理上不存在
在一个项目中,突然出现了OOM故障,那么该如何排查:
*Debug,一行行分析代码
*能够看到代码第几行出错:内存快照分析工具:MAT、Jprofiler
MAT、Jprofiler作用:
分析Dump内存文件,快速定位内存泄露
获取堆中数据
获得大的对象
。。。。。。。
-Xms 设置初始化内存分配大小 1/64
-Xmx 设置最大分配内存,默认 1/4
-xx:+PrintGCDetails 打印GC垃圾回收信息
-xx:+HeapDumpOnOutOfMemoryError //oom DUMP
10.GC垃圾回收器
GC的作用区域:方法区、堆
GC两种类别:轻GC (普通GC)、重GC(全局GC)
GC的算法类别:标记清除法、标记压缩法、复制算法、引用计数法
11.JMM
Java Memory Model(Java内存模型),围绕着在并发过程中如何处理可见性、原子性、有序性这三个特性而建立的模型
内存模型描述了程序中各个变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节
JMM是一种规范,目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。目的是保证并发编程场景中的原子性、可见性和有序性。