当前位置:网站首页>【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
边栏推荐
- 邮差"头":{“retCode”:“999999”
- To ensure that the communication mechanism
- Matlab计算随模拟时间变化的热导率
- Check which user permissions are assigned to each database, is there an interface for this?
- 历史上的今天:微软研究院的创始人诞生;陌陌正式上线;苹果发布 Newton OS
- 不需要服务器,教你仅用30行代码搞定实时健康码识别
- DocuWare平台——用于文档管理的内容服务和工作流自动化的平台(上)
- 字节API鉴权方法
- What are the useful IT asset management platforms?
- Does DMS have an interface to get the list of databases under each instance?
猜你喜欢
不需要服务器,教你仅用30行代码搞定实时健康码识别
NFT blind box mining system dapp development NFT chain game construction
项目里的各种配置,你都了解吗?
How to monitor code cyclomatic complexity by refactoring indicators
DocuWare平台——用于文档管理的内容服务和工作流自动化的平台(上)
有哪些好用的IT资产管理平台?
如何防止重复下单?
游戏云服务器配置怎么选合理?
An article to answer what is the product library of the DevOps platform
"Research Report on the Development of Global Unicorn Enterprises in the First Half of 2022" released - DEMO WORLD World Innovation Summit ended successfully
随机推荐
云存储硬核技术内幕——(12) 皮洛士惨胜罗马军团
项目里的各种配置,你都了解吗?
可视化大屏丑?这篇文章教你如何做美观大屏!
Crawler Xiaobai Notes (yesterday's supplement to pay attention to parsing data)
C# 写系统日志
dotnet core 添加 SublimeText 编译插件
Xi'an Zongheng Information × JNPF: Adapt to the characteristics of Chinese enterprises, fully integrate the cost management and control system
我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知
邮差"头":{“retCode”:“999999”
LeetCode·85.最大矩形·单调栈
平稳发展 | 西欧地区手游玩家的数据和洞察
软考 --- 软件工程(2)软件开发方法
奖金池高达 20 万,RTE 2022 创新编程挑战赛正式开启
动手学深度学习_AlexNet
【Pick-in】Advertising-information flow cross-domain CTR estimation (to be updated)
EMQ云端与局域网实现桥接功能
不需要服务器,教你仅用30行代码搞定实时健康码识别
软件性能测试包括哪些内容?国内权威软件检测机构排名
字节API鉴权方法
屏幕分辨率兼容性