1、jvm 内存模型

image-20220214153035740

1
2
3
4
5
6
7
8
9
10
11
12
13
+ 程序计数器 Program Counter Register: 
+ 记录的是正在执行的虚拟机字节码指令的地址,
+ 此内存区域是唯一一个在JAVA虚拟机规范中没有规定任何OutOfMemoryError的区域
+ 虚拟机:VM Stack
+ 描述的是 JAVA 方法执行的内存模型,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法接口等信息
+ 局部变量表存储了编译期可知的各种基本数据类型、对象引用
+ 线程请求的栈深度不够会报 StackOverflowError 异常
+ 栈动态扩展的容量不够会报 OutOfMemoryError 异常
+ 虚拟机栈是线程隔离的,即每个线程都有自己独立的虚拟机栈
+ 本地方法:Native Stack
+ 本地方法栈类似于虚拟机栈,只不过本地方法栈使用的是本地方法
+ 堆:Heap
+ 几乎所有的对象实例都在堆上分配内存

image-20220214145444465

2、堆

所有的对象实例以及数组都要在堆上分配。堆是垃圾收集器管理的主要区域,也被称为“GC堆”;也是我们优化最多考虑的地方。 堆可以细分为:

1
2
3
4
5
6
7
+ 新生代 
+ Eden 空间
+ From Survivor 空间
+ To Survivor 空间
+ 老年代
+ 永久代/元空间
+ Java8 以前永久代,受 jvm 管理,java8 以后元空间,直接使用物理内存。因此, 默认情况下,元空间的大小仅受本地内存限制。

image-20220214145921888

image-20220214145742455

image-20220214145909109

3、JVM 分析&调优

Full gc 最会影响性能,根据代码问题,避免 full gc 频率。可以适当调大年轻代容量,让大对象可以在年轻代触发 yong gc,调整大对象在年轻代的回收频次,尽可能保证大对象在年轻代回收,减小老年代缩短回收时间。

4、压测

image-20220214152417181

image-20220214152548781

现阶段优化:

1
2
3
4
5
6
7
8
9
10
11
+ 中间件
+ nginx 动静分离
+ gateway
+ db
+ 索引
+ 操作
+ log
+ redis
+ page cache
+ jvm内存
+ 业务流程