JVM
JVM
1. JVM的位置
操作系统之上,JRE包含JVM。
2. JVM体系结构
.java -> class file -> 类加载器 Class Loader -> 运行时数据区(方法区 Method Area、Java栈 Stack、本地方法栈 Native Method Stack、堆 Heap、程序计数器) -> 执行引擎/本地方法接口
3. 类加载器
加载Class文件:收到类加载的请求,向上委托,向下加载。
-
虚拟机自带的加载器
-
启动类(根)加载器
-
扩展加载器
-
应用程序加载器
报错:Class Not Found / null(Java调用不到,C/C++)
4. 双亲委派机制
安全
APP ->EXC ->BOOT(最终执行)
5. 沙箱安全机制
沙箱是一个限制程序运行的环境。引入域的概念,差异化代码执行权限。
基本组成:
-
字节码校验器:确保Java类文件遵循Java语言规范。
-
类装载器:采用双亲委派机制。防止恶意代码干涉善意代码;守护被信任的类库边界;将代码归入保护域,确定代码的可运行操作。
-
存取控制器
-
安全管理器
-
安全软件包(安全提供者、消息摘要、数字签名、加密、鉴别)
-
6. Native
达不到Java的作用范围,会进入本地方法栈,调用本地方法接口JNI(底层C语言的库)。
扩展Java的使用,融合不同编程语言为Java所用。
7. PC寄存器 Program Counter Register
线程私有。指针,指向方法区中的方法字节码。
8. 方法区 Method Area
所有线程共享的公共区间。
静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中,但是实例变量存在堆内存中,和方法区无关。
static final Class 常量池
9. 栈
程序 = 数据结构 + 算法
栈 :一种数据结构。后进先出LIFO(last-in,first-out)。
队列:FIFO(first-in,first-out)。
线程结束,栈内存就释放,不存在垃圾回收。
栈运行原理:栈帧。
实例化过程:分配内存 -> 赋默认值 -> 执行构造方法
10. 三种JVM
-
Sun公司 HotSpot
-
BEA JRockit
-
IBM J9VM
11. 堆 Heap
堆内存大小可调节。
区域:新生区(伊甸园)、养老区、永久区(元空间)。
堆内存不够OOM(OutOfMemoryError:java heap space)。
12. 新生区、老年区
新生区包括伊甸园、幸存区0区、幸存区1区。(幸存区动态调整 from...to...)
13. 永久区
这个区域常驻内存,存放JDK自身携带的Class对象、Interface元数据,也就是存储Java运行时的一些环境或类信息。这个区域不存在垃圾回收。关闭虚拟机就会释放这个区域的内存。
-
jdk1.6之前:永久代,常量池在方法区。
-
jdk1.7:去永久代,常量池在堆中。
-
jdk1.8之后:五永久代,常量池在元空间。
元空间逻辑上存在,物理上不存在。
14. 堆内存调优
处理OOM故障:
-
内存快照分析工具,MAT、Jprofiler
-
分析Dump内存文件,快速定位内存泄漏
-
获得堆中的数据
-
获得大的对象
-
-
Debug
-Xms //设置初始化内存分配大小,默认1/64
-Xmx //设置最大分配内存,默认1/4
-XX:+PrintGCDetails //打印GC垃圾回收信息
-XX:+HeapDumpOnOutOfMemoryError //oom DUMP
15. GC:垃圾回收
作用区域:方法区、堆。
大部分时候回收的都是新生代。
分类:
-
轻GC(普通的GC)
-
重GC(全局GC)
算法:
-
标记清除法(优点:不需要额外的空间。缺点:两次扫描严重浪费时间,会产生内部碎片。)
-
标记压缩(优点:再次扫描,向一端移动存活的对象,防止内存碎片产生。缺点:多了移动成本。)
-
复制算法(优点:没有内存碎片。缺点:浪费内存空间。适用场景:对象存活度较低,如新生区。)
-
引用计数器
排序:
内存效率(时间复杂度):复制算法 > 标记清除算法 > 标记压缩算法
内存整齐度:复制算法 = 标记压缩算法 > 标记清除算法
内存利用率:标记压缩算法 > 标记清除算法 > 复制算法
GC分代收集算法:
-
年轻代:复制算法
-
老年代:标记清除 + 标记压缩 混合实现
16. JMM (Java Memory Model)
Java内存模型。
缓存一致性协议。保证Java程序在多线程环境下主内存和工作内存结果一致。
核心特性:
-
原子性 Atomicity
-
可见性 Visibility
- 实现方式:
volatile、synchronized、final 都能保证可见性。
- 实现方式:
-
有序性 Ordering
- 实现方式:
volatile和synchronized可以禁止指令重排序。
- 实现方式:
浙公网安备 33010602011771号