GC 为何会导致线程数降低?

疑惑

近期收到一些报警,是方法性能报警,定位原因主要是瞬时流量突增引起的,但是观察方法中查询 MySQL 的性能不差,性能花费在哪里?同时观察 JVM 性能,发现 YoungGC 变多了,CPU 使用率高了,但线程数在当时刻降低了,YoungGC 会创建新线程进行垃圾回收,应该线程数增多,为什么会降低的?

解惑

性能为什么慢了?

由于提供服务的 API 所依赖的 MySQL 性能并不慢,那原因是什么?唯一的问题点就是流量,流量突增引发系统开启大量线程进行处理,线程状态处于 Running 或 Runable 状态,这时操作系统(分时操作系统)会让 CPU 进行分时处理,从而引发 CPU 使用率上升。多线程并发处理会让服务器处理速度变快,但对于单个服务响应会变慢。

还有我们一般的系统架构部署多是 Nginx - Tomcat,而 Tomcat 默认线程数多是1000上限,且Tomcat 7以下版本默认是 BIO 模式,超过上限的线程会在 Tomcat 阻塞队列里等待,所以对于调用方来说,感知的时间会更久一些。

This chapter requires login to view full content. You are viewing a preview.

Login to View Full Content

Course Curriculum

3

框架与 I/O:Spring、Netty 与 Web 容器

理解 Spring Boot 自动装配、AOP 与事务原理,掌握 Netty Reactor 模型及 Tomcat 连接处理机制,构建高内聚、易扩展的应用服务层。
4

高性能中间件:消息、缓存与存储

熟练运用 MySQL 索引/事务、Redis 缓存策略、Kafka/RocketMQ 消息可靠性,以及 ZooKeeper 分布式协调,搭建稳定、解耦的分布式数据底座。
6

云原生:容器化、可观测性与工程效能

通过 Docker/K8s 实现弹性部署,集成 Metrics/Logs/Traces 构建可观测体系,推动 DevOps 与自动化,让架构在云上持续交付与进化。