jvm 内存模型

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

所有的
对象实例以及数组都要在堆上分配。堆是垃圾收集器管理的主要区域,也被称为“GC堆”;也是我们优化最多考虑的地方。
堆可以大致分为三部分
新生代:
Eden 空间(伊甸园区)
From Survivor(s0) 空间
To Survivor(s1) 空间老年代
永久代/元空间
Java8 以前永久代,受jvm 管理,java8 以后元空间,直接使用物理内存。因此,
默认情况下,元空间的大小仅受本地内存限制
GC垃圾回收
垃圾回收存在于新生代和老年代中
在创建对象时,需要分配内存,先去新生代的伊甸园区(Eden)判断内存够不够,够的话就直接分配内存,如果不够就要进行一次 Young GC,主要是清理新生代的空间,主要看新生代中的对象是否还在用,不在用的对象GC掉,新生代中还在用的对象放在幸存区中,如果幸存者区中的对象存活超过阈值把这些对象放到到老年代(默认对象16次),如果这个对象比较大在幸存者区还是放不下,如果老年代能放下的话就将对象放在老年代中,如果老年代还放不下就会进行一次Full GC(全面GC),如果还放不下就会报内存溢出。Full GC 非常消耗时间,所以尽量避免大对象的创建,老年代中放的都是那些生命力持久的对象和大对象
jvisualvm
jvisualvm可以用来监控内存泄露,跟踪垃圾回收,执行时内存、cpu 分析,线程分析…
运行:正在运行的
休眠:sleep
等待:wait
驻留:线程池里面的空闲线程
监视:阻塞的线程,正在等待锁
安装插件方便查看gc
Cmd 启动jvisualvm
工具->插件


如果503 错误解决:
打开网址https://visualvm.github.io/pluginscenters.html
cmd 查看自己的jdk 版本,找到对应的
复制下面查询出来的链接。并重新设置上即可
中间件指标

- 当前正在运行的线程数不能超过设定的最大值。一般情况下系统性能较好的情况下,线
程数最小值设置50 和最大值设置200 比较合适。 - 当前运行的JDBC 连接数不能超过设定的最大值。一般情况下系统性能较好的情况下,
JDBC 最小值设置50 和最大值设置200 比较合适。 - GC频率不能频繁,特别是FULL GC 更不能频繁,一般情况下系统性能较好的情况下,
JVM 最小堆大小和最大堆大小分别设置1024M 比较合适。
数据库指标

- SQL 耗时越小越好,一般情况下微秒级别。
- 命中率越高越好,一般情况下不能低于95%。
- 锁等待次数越低越好,等待时间越短越好。
压测对比吞吐量

- 中间件越多,性能损失越大,大多都损失在网络交互了;
- 业务:
Db(MySQL 优化)
模板的渲染速度(缓存)
静态资源
首页渲染优化:
开启模板语言缓存,调整日志输出级别,优化数据库
数据库简单优化:
检索条件字段添加索引

静态资源优化:
Nginx动静分离

如下这种静态资源
<script type="text/javascript" src="/static/index/js/text.js"></script>
<script type="text/javascript" src="/static/index/js/header.js"></script>
<script type="text/javascript" src="/static/index/js/secend.js"></script>
<script type="text/javascript" src="/static/index/js/zz.js"></script>
<script type="text/javascript" src="/static/index/js/index.js"></script>
<script type="text/javascript" src="/static/index/js/left,top.js"></script>
<script type="text/javascript" src="/static/index/js/catalogLoader.js"></script>
文件的请求前缀都是 /static/
可以将静态资源都放在nginx下
然后再nginx配置文件中进行配置
server {
listen 80;
server_name xmall.com;
#/static/* 的请求
location /static/ {
root D:/nginx/nginx-1.21.0/html;
}
}
优化GC
压测时 由于伊甸园区内存较小 一直在频繁GC 要避免频繁GC
老年代 fullGC内存小也会频繁GC 也会浪费内存
