当前位置:网站首页>【JVM】JVM调优
【JVM】JVM调优
2022-08-04 16:08:00 【Learn Forever】
1.OOM分析-堆内存
(1).jmap
jmap -dump:live,format=b,file=heap.bin pid
导出.bin文件使用MAT工具分析
MAT 下载
官网地址:https://www.eclipse.org/mat/
2.OOM分析-栈内存
(1).问题:unable to create new native thread
1).系统参数:
系统级最大进程ID
$ sysctl -a | grep kernel.pid_max
kernel.pid_max = 32768
# 输出结果表示当前系统允许的最大进程数为32768
$ cat /proc/sys/kernel/pid_max
# 命令功用与上述同样
$ echo 200000 > /proc/sys/kernel/pid_max
# 修改系统级最大进程数为200000,可通过sysctl查看修改
系统级最大线程数
# /proc/sys/kernel/threads-max 限制了系统级最大线程数
$ echo 120000 > /proc/sys/kernel/threads-max
# 修改系统级最大线程数为120000,可通过sysctl查看修改
# Linux没有每个进程单独的最大线程数限制
ulimit 检查OS是否允许用户申请足够多的进程(含线程)
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 515005
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 4096
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
# 通过ulimit -u,可见用户默认的最大进程(含线程)数是1024
# 通过ulimit -s,可见进程默认的最大栈大小是10M
$ ulimit -u 32000
# 更改用户默认的最大进程(含线程)数为32000
Linux对最大线程数的硬控制
number of threads = total virtual memory / (stack size10241024)
从上可知,最大线程数的增加可以通过增加虚拟内存或减少线程栈大小两种手段。
但是,减少线程栈大小可能会导致栈溢出的异常。
$ ulimit -v newValue
# 更改进程默认的虚拟内存大小
$ ulimit -s newValue
# 更改进程默认的栈大小
max_map_count 间接影响线程数量
max_map_count文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量。默认值是65536。
虚拟内存区域是一个连续的虚拟地址空间区域。在进程的生命周期中,每当程序尝试在内存中映射文件,链接到共享内存段,或者分配堆空间的时候,这些区域将被创建。
调优这个值将限制进程可拥有VMA的数量。限制一个进程拥有VMA的总数可能导致应用程序出错,因为当进程达到了VMA上限但又只能释放少量的内存给其他的内核进程使用时,操作系统会抛出内存不足的错误。
如果你的操作系统在NORMAL区域仅占用少量的内存,那么调低这个值可以帮助释放内存给内核用。
因值过低抛错在JVM中可能会呈现Java.lang.OutOfMemoryError: Map failed。详情参见max_map_count超出导致的OOM
$ echo 'vm.max_map_count=655360' >> /etc/sysctl.conf
# rocketmq系统参数配置了默认值的10倍
$ echo 600000 > /proc/sys/vm/max_map_count
# 更改VMA映射数量为600000,可通过sysctl查看修改
https://blog.csdn.net/u010030022/article/details/103523716
2.JVM三大性能调优参数Xms,Xmx,Xss
-Xss:规定了每个线程虚拟机栈及堆栈的大小,一般情况下,256k是足够的,此配置将会影响此进程中并发线程数的大小。
-Xms:表示初始化JAVA堆的大小及该进程刚创建出来的时候,他的专属JAVA堆的大小,一旦对象容量超过了JAVA堆的初始容量,JAVA堆将会自动扩容到-Xmx大小。
-Xmx:表示java堆可以扩展到的最大值,在很多情况下,通常将-Xms和-Xmx设置成一样的,因为当堆不够用而发生扩容时,会发生内存抖动影响程序运行时的稳定性。
3.调优工具-arthas
边栏推荐
- 分支控制if-else
- C# 写系统日志
- DocuWare Platform - Content Services and Workflow Automation Platform for Document Management (Part 1)
- 备战9月,美团50道软件测试经典面试题及答案汇总
- In-depth analysis of HyperBDR cloud disaster recovery 1: Cloud-native cross-platform disaster recovery, making data flow more flexible
- Check which user permissions are assigned to each database, is there an interface for this?
- 【二叉树】根据描述创建二叉树
- No server is required, teach you to get real-time health code recognition with only 30 lines of code
- 奖金池高达 20 万,RTE 2022 创新编程挑战赛正式开启
- 转型阵痛期,好未来减亏容易增收难?
猜你喜欢
74行代码实现浪漫的红心下落的动画效果
7 月浏览器市场份额:Edge 全球第二、360 安全浏览器中国第二
字节API鉴权方法
如何防止重复下单?
NFT blind box mining system dapp development NFT chain game construction
工龄10年的测试员从大厂“裸辞”后...
Xi'an Zongheng Information × JNPF: Adapt to the characteristics of Chinese enterprises, fully integrate the cost management and control system
平稳发展 | 西欧地区手游玩家的数据和洞察
面了三十个人,说说真实感受
DevOps平台中的制品库是什么?有什么用处?
随机推荐
云存储硬核技术内幕——小结(上)
MySQL 性能调优和优化技巧
Real-Time Rendering 4th相关资源整理(无需积分 传火)
2022-08-04日报:量化细胞内的信息流:机器学习时代下的研究进展
To ensure that the communication mechanism
功率放大器的设计要点
邮差"头":{“retCode”:“999999”
Pulsar消费者处理不当导致的消息积压问题
奖金池高达 20 万,RTE 2022 创新编程挑战赛正式开启
皕杰报表配置文件report_config.xml里都配置了什么?
[TA-Frost Wolf_may-"Hundred Talents Project"] Art 2.7 Metallic and Speculer Process
【Es6中的promise】
多商户商城系统功能拆解24讲-平台端分销会员
张乐:研发效能的黄金三角及需求与敏捷协作领域的实践|直播回顾
无心剑七绝《七夕牵手》
SAP HANA Schemas 和 HDI Containers
什么是会话劫持攻击以及如何防止会话劫持
leetcode:743. 网络延迟时间【单源最短路 + dijkstra模板】
越来越火的图数据库到底能做什么?
微信小程序获取年月日周及早上、中午、晚上