jvm cpu 100% 负载明显增加

博客内容分析了JVM中CPU负载升至100%的问题,指出可能是由于堆内存不足或内存泄漏导致。文章讨论了Java堆内存的细分,如新生代、老年代等,并介绍了JVM参数如-Xmx、-Xms和-Xmn的作用。还提到了垃圾收集算法和不同类型的垃圾回收器,包括引用计数、可达性分析、分代收集等,并提及了常用的JVM诊断工具如jps、jstat等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jstat -gcutil 123456 2000 1000

123456 是pid

2000 是以毫秒表示的采样周期

1000 是采样的数量

100% 说明应该是 jvm 堆内存不够 或者内存泄漏

jmap -dump:file=heap.dump 123456

显示了与gc相关的堆信息输出

jstat -gc 123456

显示了最近一次gc的原因以及当前gc的原因

jstat -gccause 123456

java堆可以细分为: 新生代 和老年代 再细致一点有Eden空间 From Survivor空间,To Survivor空间等

-Xmx: 最大推是指新生代和老年代的大小之和的最大值,它是应用程序的堆上限。

-Xms: 可以用于设置系统的最小堆空间。也就是JVM启动时,所占据的操作系统内存大小。

-Xmn: 用于设置新生代的大小

tomcat catlina.sh

JAVA_OPTS="-Xms2048m -Xms2048m -Xmn800m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:MaxTenuringThreshold=10 -XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails -Xloggc:/home/demo/tools/apache-tomcat-8.5.51/logs/gc.log"
ps -ef|grep tomca
root      6874     1 66 21:20 pts/0    00:00:05 /h
jmap -heap 6874
Attaching to process ID 6874, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 2147483648 (2048.0MB)
   NewSize                  = 838860800 (800.0MB)
   MaxNewSize               = 838860800 (800.0MB)
   OldSize                  = 1308622848 (1248.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 268435456 (256.0MB)
   CompressedClassSpaceSize = 528482304 (504.0MB)
   MaxMetaspaceSize         = 536870912 (512.0MB)
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 629145600 (600.0MB)
   used     = 276853800 (264.02835845947266MB)
   free     = 352291800 (335.97164154052734MB)
   44.00472640991211% used
From Space:
   capacity = 104857600 (100.0MB)
   used     = 0 (0.0MB)
   free     = 104857600 (100.0MB)
   0.0% used
To Space:
   capacity = 104857600 (100.0MB)
   used     = 0 (0.0MB)
   free     = 104857600 (100.0MB)
   0.0% used
PS Old Generation
   capacity = 1308622848 (1248.0MB)
   used     = 0 (0.0MB)
   free     = 1308622848 (1248.0MB)
   0.0% used

16530 interned Strings occupying 1542832 bytes.

MaxTenuringThreshold: 设置对象进入老年代的年龄的最大值。

常用命令:
jps jstat jinfo jmap jhat jstak

垃圾搜集算法
1 引用计数算法
2 可达性分析算法
3 标记-清除算法
4 复制算法
5 标记-整理算法
6 分代收集算法

垃圾回收器的分类

按线程数分类(串行/ 并行 )

单线程执行所有的垃圾回收工作,适用于单核CPU服务器
工作进程----|(单线程)垃圾回收线程进行垃圾收集|---工作进行继续


工作进程----|(多线程)垃圾回收线程进行垃圾收集|---工作进行继续
适用于多处理器或多线程硬件上运行的数据量较大的应用

按工作模式分类
并发垃圾回收器 独占垃圾回收器
按碎片处理分类
压缩垃圾回收器 非压缩垃圾处理器
按分代分类
新生代垃圾处理器 老年代垃圾处理器

参考:

https://blog.youkuaiyun.com/flysqrlboy/article/details/79314521
https://blog.youkuaiyun.com/lkforce/article/details/60878295
https://blog.youkuaiyun.com/he_jian1/article/details/40787269
jvm 内存结构
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html

您好!对于Tomcat导致CPU占用率达到100%的问题,有几个常见的原因和解决方法可以尝试: 1. 确定是否有代码或应用程序问题:检查应用程序的代码是否存在死循环、无限递归或其他性能问题。您可以使用性能分析工具(如VisualVM、JProfiler等)来检测应用程序的性能瓶颈,并进行相应的优化。 2. 调整Tomcat的线程池配置:Tomcat默认使用的线程池是基于线程池的连接器(ThreadPoolExecutor),您可以尝试调整其配置参数,如最大线程数(maxThreads)、最小空闲线程数(minSpareThreads)等,以适应您的应用程序负载。 3. 调整JVM参数:您可以通过调整JVM参数来优化Tomcat的性能,如增加堆内存大小(-Xmx)和持久代大小(-XX:MaxPermSize)、设置GC算法等。根据您的具体情况,可能需要进行一些试验和调整。 4. 检查应用程序依赖和配置:确保应用程序所依赖的第三方库和组件版本正确,并且配置文件没有错误或冲突。有时,不正确的配置可能导致应用程序出现性能问题。 5. 考虑使用性能监控工具:可以使用一些监控工具(如Zabbix、Grafana等)来实时监测Tomcat的性能指标,并进行及时的故障排查和优化。 请注意,以上只是一些建议和常见解决方法,具体的处理方式可能需要根据您的具体情况来确定。如果问题持续存在,建议您联系专业的运维人员或咨询Tomcat相关的技术支持团队,以获取更准确和针对性的帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值