面试题:JVM 调优
一、JVM 参数设置
1. tomcat 的设置 vm 参数
修改 TOMCAT_HOME/bin/catalina.sh
文件,如下图
JAVA_OPTS="-Xms512m -Xmx1024m"
2. springboot 项目 jar 文件启动
通常在linux系统下直接加参数启动springboot项目
nohup java -Xms512m -Xmx1024m -jar xxxx.jar --spring.profiles.active=prod &
- nohup:这个命令用于在用户退出终端会话后,保持程序运行。
- java:这是运行Java应用程序的命令。
- -Xms512m:设置Java虚拟机的初始堆内存为512MB。
- -Xmx1024m:设置Java虚拟机的最大堆内存为1024MB。
- -jar:告诉Java命令,接下来的参数是一个JAR文件。
- xxxx.jar:这是要运行的Java应用程序的JAR文件名。
- –spring.profiles.active=prod:这是Spring Boot应用程序的配置,用于激活生产环境的配置文件。
- 参数 & :让命令在后台执行,终端退出后命令仍旧执行。
二、JVM 参数调优
对于JVM调优,主要就是调整年轻代、老年代、元空间的内存空间大小及使用的垃圾回收器类型。
👨🏫 官网虚拟机调优参数选项
1. 堆
设置堆的初始大小和最大大小,为了防止垃圾收集器在初始大小、最大大小之间收缩堆而产生额外的时间,通常把最大、初始大小设置为相同的值。
-Xms:设置堆的初始化大小-Xmx:设置堆的最大大小
2. 新生代
设置新生代中Eden区和两个Survivor区的大小比例。该值如果不设置,则默认比例为8:1:1。Java官方通过增大 Eden区的大小,来减少YGC发生的次数,但有时我们发现,虽然次数减少了,但Eden区满的时候,由于占用的空间较大,导致释放缓慢,此时STW的时间较长,因此需要按照程序情况去调优。
-XXSurvivorRatio=3,表示年轻代中的分配比率:survivor:eden = 2:3
年轻代和老年代默认比例为1:2。可以通过调整二者空间大小比率来设置两者的大小。
-XX:NewRatio 控制年轻代与老年代的大小比例
-XX:newSize 设置年轻代的初始大小
-XX:MaxNewSize 设置年轻代的最大大小, 初始大小和最大大小两个值通常相同
3. 线程栈
线程堆栈的设置:每个线程默认会开启1M的堆栈,用于存放栈帧、调用参数、局部变量等,但一般256K就够用。通常减少每个线程的堆栈,可以产生更多的线程,但这实际上还受限于操作系统。
-Xss 对每个线程stack大小的调整,-Xss128k
4. 调优经验
一般来说,当survivor区不够大或者占用量达到50%,就会把一些对象放到老年区。通过设置合理的eden区,survivor区及使用率,可以将年轻对象保存在年轻代,从而避免full GC,使用-Xmn
设置年轻代的大小
系统CPU持续飙高的话,首先先排查代码问题,如果代码没问题,则咨询运维或者云服务器供应商,通常服务器重启或者服务器迁移即可解决。
对于占用内存比较多的大对象,一般会选择在老年代分配内存。如果在年轻代给大对象分配内存,年轻代内存不够了,就要在eden区移动大量对象到老年代,然后这些移动的对象可能很快消亡,因此导致full GC。通过设置参数:-XX:PetenureSizeThreshold=1000000
,单位为B,标明对象大小超过1M时,在老年代(tenured)分配内存空间。
一般情况下,年轻对象放在eden区,当第一次GC后,如果对象还存活,放到survivor区,此后,每GC一次,年龄增加1,当对象的年龄达到阈值,就被放到tenured老年区。这个阈值可以同构-XX:MaxTenuringThreshold
设置。如果想让对象留在年轻代,可以设置比较大的阈值。
-XX:+UseParallelGC
年轻代使用并行垃圾回收收集器。这是一个关注吞吐量的收集器,可以尽可能的减少垃圾回收时间。-XX:+UseParallelOldGC
设置老年代使用并行垃圾回收收集器。
5. 内存分页
尝试使用大的内存分页:使用大的内存分页,从而减少页表条目的数量,提高缓存命中率,进而提高系统的性能。
-XX:+LargePageSizeInBytes
设置内存页的大小
6. 垃圾回收器
使用非占用的垃圾回收器。
-XX:+UseConcMarkSweepGC
老年代使用CMS收集器降低停顿。
三、JVM 调优工具
1. 命令工具
① jps(Java Process Status)
输出JVM中运行的进程状态信息 (现在一般使用jconsole)
② jstack
查看java 进程
内线程的堆栈 信息。
jstack [option] <pid>
java案例
package com.heima.jvm;public class Application {public static void main(String[] args) throws InterruptedException {while (true){Thread.sleep(1000);System.out.println("哈哈哈");}}
}
使用 jstack 查看进行堆栈运行信息
③ jmap
用于生成堆转存快照
jmap [options] pid
内存映像信息
jmap -heap pid
显示Java堆的信息
jmap -dump:format=b,file=heap.hprof pid
- format=
b
表示以 hprof二进制
格式转储Java堆的内存- file=用于指定快照dump文件的文件名
例:显示了某一个java运行的堆信息
C:\Users\yuhon>jmap -heap 53280
Attaching to process ID 53280, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.321-b07using thread-local object allocation.
Parallel GC with 8 thread(s) //并行的垃圾回收器Heap Configuration: //堆配置MinHeapFreeRatio = 0 //空闲堆空间的最小百分比MaxHeapFreeRatio = 100 //空闲堆空间的最大百分比MaxHeapSize = 8524922880 (8130.0MB) //堆空间允许的最大值NewSize = 178257920 (170.0MB) //新生代堆空间的默认值MaxNewSize = 2841640960 (2710.0MB) //新生代堆空间允许的最大值OldSize = 356515840 (340.0MB) //老年代堆空间的默认值NewRatio = 2 //新生代与老年代的堆空间比值,表示新生代:老年代=1:2SurvivorRatio = 8 //两个Survivor区和Eden区的堆空间比值为8,表示S0:S1:Eden=1:1:8MetaspaceSize = 21807104 (20.796875MB) //元空间的默认值CompressedClassSpaceSize = 1073741824 (1024.0MB) //压缩类使用空间大小MaxMetaspaceSize = 17592186044415 MB //元空间允许的最大值G1HeapRegionSize = 0 (0.0MB)//在使用 G1 垃圾回收算法时,JVM 会将 Heap 空间分隔为若干个 Region,该参数用来指定每个 Region 空间的大小。Heap Usage:
PS Young Generation
Eden Space: //Eden使用情况capacity = 134217728 (128.0MB)used = 10737496 (10.240074157714844MB)free = 123480232 (117.75992584228516MB)8.000057935714722% used
From Space: //Survivor-From 使用情况capacity = 22020096 (21.0MB)used = 0 (0.0MB)free = 22020096 (21.0MB)0.0% used
To Space: //Survivor-To 使用情况capacity = 22020096 (21.0MB)used = 0 (0.0MB)free = 22020096 (21.0MB)0.0% used
PS Old Generation //老年代 使用情况capacity = 356515840 (340.0MB)used = 0 (0.0MB)free = 356515840 (340.0MB)0.0% used3185 interned Strings occupying 261264 bytes.
④ jstat
是JVM统计监测工具。可以用来显示垃圾回收信息、类加载信息、新生代统计信息等。
常见参数:
-gcutil
提供的是垃圾收集活动的概览,而 -gc
提供的是更详细的内存和垃圾收集活动的统计信息
💖 垃圾回收统计概览
显示垃圾收集器的高阶统计信息
jstat -gcutil pid
字段 | 含义 |
---|---|
S0 | 幸存1区当前使用比例 |
S1 | 幸存2区当前使用比例 |
E | 伊甸园区使用比例 |
O | 老年代使用比例 |
M | 元数据区使用比例 |
CCS | 压缩使用比例 |
YGC | 年轻代垃圾回收次数 |
YGCT | 年轻代垃圾回收消耗时间 |
FGC | 老年代垃圾回收次数 |
FGCT | 老年代垃圾回收消耗时间 |
GCT | 垃圾回收消耗总时间 |
💖 垃圾回收统计详情
用于显示与垃圾收集相关的统计信息
jstat -gc pid
⑤ jhat
用于分析 jmap 生成的堆转存快照(一般不推荐使用,而是使用Ecplise Memory Analyzer)
2. 可视化工具
① jconsole
用于对jvm的内存,线程,类 的监控,是一个基于 jmx 的 GUI 性能监控工具
打开方式:java 安装目录 bin目录下 直接启动 jconsole.exe 就行
可以内存、线程、类等信息
② VisualVM:故障处理工具
能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈
打开方式:java 安装目录 bin目录下 直接启动 jvisualvm.exe就行
监控程序运行情况
查看运行中的dump
查看堆中的信息
四、 java内存泄露的排查思路?
原因:
如果线程请求分配的栈容量超过 java虚拟机栈允许的最大容量的时候,java虚拟机将抛出一个 StackOverFlowError异常
如果java虚拟机栈可以动态拓展,并且扩展的动作已经尝试过,但是目前无法申请到足够的内存去完成拓展,或者在建立新线程的时候没有足够的内存去创建对应的虚拟机栈,那java虚拟机将会抛出一个OutOfMemoryError异常
如果一次加载的类太多,元空间内存不足,则会报 OutOfMemoryError: Metaspace
1、通过jmap指定打印他的内存快照 dump
有的情况是内存溢出之后程序则会直接中断,而jmap只能打印在运行中的程序,所以建议通过参数的方式的生成 dump文件,配置如下:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/app/dumps/ 指定生成后文件的保存目录
2、通过工具, VisualVM(Ecplise MAT)去分析 dump文件
VisualVM可以加载离线的dump文件,如下图
文件 —> 装入 —>选择dump文件即可查看堆快照信息
如果是linux系统中的程序,则需要把dump文件下载到本地(windows环境)下,打开VisualVM工具分析。VisualVM目前只支持在windows环境下运行可视化
3、通过查看堆信息的情况,可以大概定位内存溢出是哪行代码出了问题
4、找到对应的代码,通过阅读上下文的情况,进行修复即可
五、CPU飙高排查方案与思路?
1.使用top命令查看占用cpu的情况
2.通过top命令查看后,可以查看是哪一个进程占用cpu较高,上图所示的进程为:30978
3.查看当前线程中的进程信息
ps H -eo pid,tid,%cpu | grep 40940
pid 进行id
tid 进程中的线程id
% cpu使用率
4.通过上图分析,在进程30978中的线程30979占用cpu较高
注意:上述的线程 id 是一个十进制,我们需要把这个线程 id 转换为16进制才行,因为通常在日志中展示的都是16进制的线程id名称
转换方式:
在linux中执行命令
printf "%x\n" 30979
5.可以根据线程 id 找到有问题的线程,进一步定位到问题代码的源码行号
执行命令
jstack 30978 此处是进程id
相关文章:
面试题:JVM 调优
一、JVM 参数设置 1. tomcat 的设置 vm 参数 修改 TOMCAT_HOME/bin/catalina.sh 文件,如下图 JAVA_OPTS"-Xms512m -Xmx1024m" 2. springboot 项目 jar 文件启动 通常在linux系统下直接加参数启动springboot项目 nohup java -Xms512m -Xmx1024m -jar…...
PS从入门到精通视频各类教程整理全集,包含素材、作业等(8)
PS从入门到精通视频各类教程整理全集,包含素材、作业等 最新PS以及插件合集,可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制,今天先分享到这里,后续持续更新 B站-PS异闻录:萌新系统入门课课程视频 …...
VSCode安装及Python、Jupyter插件安装使用
VSCode 介绍 Visual Studio Code(简称VSCode)是一个由微软开发的免费、开源的代码编辑器。VSCode是一个轻量级但是非常强大的代码编辑器,它支持多种编程语言(如C,C#,Java,Python,PHP࿰…...
JMeter+Grafana+influxdb 配置出现transaction无数据情况解决办法
JMeterGrafanainfluxdb 配置出现transaction无数据情况解决办法 一、问题描述二、解决方法 一、问题描述 如下图所示出现application有数据但是transaction无数据情况 二、解决方法 需要做如下设置 打开变量设置如下图打开两个选项 然后再进行后端监听器的设置 如下图所…...
Acrobat Pro DC 2023 for Mac PDF编辑管理软件
Acrobat Pro DC 2023 for Mac是一款功能强大的PDF编辑和管理软件,旨在帮助用户轻松处理PDF文件。它提供了丰富的工具和功能,使用户可以创建、编辑、转换和注释PDF文件,以及填写和签署PDF表单。 软件下载:Acrobat Pro DC 2023 for …...
Python大型数据集(GPU)可视化和Pillow解释性视觉推理及材料粒子凝聚
🎯要点 Python图像处理Pillow库:🎯打开图像、保存图像、保存期间的压缩方式、读取方法、创建缩略图、创建图像查看器。🎯获取 RGB 值,从图像中获取颜色,更改像素颜色,转换为黑…...
1、快速上手Docker:入门指南
文章目录 Linux中安装docker防火墙端口配置web项目需要的环境安装yarn安装nodejs安装脚手架并准备项目 构建镜像启动镜像查看日志管理镜像推送镜像 发布项目准备服务器环境部署项目: PS:扩展一点小知识 这篇文章只是docker入门的第一个Docker项目&#x…...
通用开发技能系列:Authentication、OAuth、JWT 认证策略
云原生学习路线导航页(持续更新中) 本文是 通用开发技能系列 文章,主要对编程通用技能 Authentication、OAuth、JWT 认证策略 进行学习 1.Basic Authentication认证 每个请求都需要将 用户名密码 进行base64编码后,放在请求头的A…...
【Leetcode】【240404】1614. Maximum Nesting Depth of the Parentheses
BGM(?):圣堂之门-阿沁《梵谷的左耳》 Description A string is a valid parentheses string (denoted VPS) if it meets one of the following: It is an empty string “”, or a single character not equal to “(” or “)…...
联通iccid 19转20 使用luhn 算法的计算公式
联通iccid 19转20 使用luhn 算法的计算公式 第一次对接iccid 才知道 使用的是luhn 算法 19转20位 文章来源于 文章来源 当时也是一脸懵逼 的状态,然后各种chatgpt 寻找,怎么找都发现不对,最后看到这片java的文章实验是正确的,因…...
I.MX6ULL的MAC网络外设设备树实现说明一
一. 简介 IMX6ULL芯片内部集成了两个 10/100M 的网络 MAC 外设,所以,ALPHA开发板上的有线网络的硬件方案是: SOC内部集成网络MAC外设 PHY网络芯片方案。 本文来说明一下MAC网络外设的设备节点信息的实现。 因此, I.MX6ULL 网络…...
vue弹出的添加信息组件中 el-radio 单选框无法点击问题
情景描述:在弹出的添加信息的组件中的form中有一个单选框,单选框无法进行点击切换 原因如下: 单选框要求有个默认值,因为添加和更新操作复用同一个组件,所以我在初始化时对相关进行了判定,如果为空则赋初始值 结果这样虽然实现了初始值的展示,但是就是如此造成了单选框的无法切…...
蓝桥杯刷题day13——玩游戏【算法赛】
一、问题描述 小 A 和小 B 两个人在海边找到了 n 个石子,准备开始进行一些游戏,具体规则如下:小 B 首先将 n 个石子分成若干堆,接下来从小 A 开始小 A 和小 B 轮流取石子,每次可以任选一堆石子取走任意个,…...
Three.js——scene场景、几何体位置旋转缩放、正射投影相机、透视投影相机
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...
springboot集成rabbitmq
一 添加pom <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency>二,配置yml spring:rabbitmq:host: 192.168.56.200port: 5672username: adminpasswor…...
腾讯云轻量4核8G12M应用服务器性能测评和优惠价格表
腾讯云4核8G服务器价格:轻量4核8G12M优惠价格646元15个月、CVM S5服务器4核8G配置1437元买1年送3个月。腾讯云4核8G服务器支持多少人同时在线?支持30个并发数,可容纳日均1万IP人数访问。腾讯云百科txybk.com整理4核8G服务器支持多少人同时在线…...
判断点在多边形内的算法
在计算几何中,判定点是否在多边形内,是个非常有趣的问题。通常有两种方法: 一、Crossing Number(交叉数) 它计算从点P开始的射线穿过多边形边界的次数。当“交叉数”是偶数时,点在外面;当它是奇数时&…...
Network AIS Receiver R400N
目录 Introduction OVERVIEW BASIC FEATURES APPLICATIONS SPECIFICATIONS Introduction OVERVIEW The R400N provides a method of monitoring the position, speed and heading of AIS vessels within VHF range. It can decode of Class A, Class B, Aids to Navigat…...
JavaScript循环
JavaScript的循环有两种,一种是for循环,通过初始条件、结束条件和递增条件来循环执行语句块: var x 0; var i; for (i1; i<10000; i) { x x i; } x; // 50005000 for循环的3个条件都是可以省略的,如果没有退出循环的判断条件…...
9Proxy,跨境电商一站式解决方案
文章目录 跨境电商什么是跨境电商跨境电商的机遇跨境电商技术支撑 海外代理IP什么是海外代理IP海外代理IP的作用如何选择海外代理IP 9Proxy9Proxy的优势9Proxy的解决方案价格汇总搜索引擎优化市场调查多重核算数据抓取广告技术 价格上手体验注册登录下载安装数据采集 总结福利 …...
ObjectiveC-08-OOP面向对象程序设计-类的分离与组合
本节用一简短的文章来说下是ObjectiveC中的类。类其实是OOP中的一个概念,概念上简单来讲类是它是一组关系密切属性的集合,所谓的关系就是对现实事物的抽象。 上面提到的关系包括很多种,比如has a, is a,has some等&…...
Qt 总结
由于工作需要用到Qt。把过程中学习到的东西记录下来,希望能帮到他人和将来的自己。 由于需要快速实现需求,所以对Qt只是使用,并没有对原理的深入理解。 故此文只适合入门,不适合深入学习Qt。 文章目录 安装&维护示例&教…...
中间件复习之-RPC框架
什么是RPC框架? RPC(Remote Procedure Call):远程过程调用。当多个应用部署在多个服务器上时,由于他们不在一个内存空间上,因此需要网络来进行通信,而RPC允许它像调用本地方法一样调用远程服务。 RPC原理 服务消费方通过RPC客户…...
AcWing 787. 归并排序——算法基础课题解
AcWing 787. 归并排序 文章目录 题目描述CGo模板 题目描述 给定你一个长度为 n 的整数数列。 请你使用归并排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行,第一行包含整数 n。 第二行包含 n 个整数(所有…...
力扣1379---找出克隆二叉树的相同节点(Java、DFS、简单题)
目录 题目描述: 思路描述: 代码: (1): (2): 题目描述: 给你两棵二叉树,原始树 original 和克隆树 cloned,以及一个位于原始树 ori…...
FLink学习(三)-DataStream
一、DataStream 1,支持序列化的类型有 基本类型,即 String、Long、Integer、Boolean、Array复合类型:Tuples、POJOs 和 Scala case classes Tuples Flink 自带有 Tuple0 到 Tuple25 类型 Tuple2<String, Integer> person Tuple2.…...
Failed to resolve import “Home/components/HomeNew.vue“. Does the file exist?
错误信息 [plugin:vite:import-analysis] Failed to resolve import "/apis/home.js" from "src/views/Home/components/HomeNew.vue". Does the file exist? 错误原因 路径错误 解决方法...
《价值》-张磊-高瓴资本-3-建立人脉和信任;顺应趋势,把握机遇;
第三章 价值投资初试炼 2005.6.1 创办高瓴资本 许多人问我为什么一直在创业,其实我倒没想到自己非要创业成功不可,只是觉得一定要做点事,做点有意义的事。归根到底,可能是“爱折腾,不满足现状,爱挑战自己”…...
游戏引擎中的物理应用
一、 角色控制器 Character Controller和普通的动态对象(Dynamic Actor )是不同的,主要的三个特点是: 它拥有可控制的刚体间的交互假设它是有无穷的摩擦力(可以站停在位置上),没有弹性加速和刹车几乎立即…...
复现k8s黄金票据学习
1.什么是黄金票据 在 Kubernetes 中,"黄金票据"并不是一个常见的术语。可能你想了解的是服务账户(Service Account)。服务账户是 Kubernetes 中用于身份验证和授权的一种机制。它们允许 Pods 或其他工作负载在 Kubernetes 集群中与…...
网站优化我自己可以做吗/google浏览器下载
一、MySQL官网下载MySQL5.7版本,我这里下载的是MySQL5.7.24。二、直接到D:phpStudyPHPTutorial目录下删除之前的MySQL版本,把下载好的MySQL5.7.24版本解压并修改为MySQL,然后在MySQL目录下新建my.ini文件并加入如下内容: [mysqld] port3306 b…...
创新能力建设资金网站/seo整站优化什么价格
对乔布斯和马斯克访谈的反思: 1、这个世界不在乎你的自尊,只在乎你自我感觉良好的同时有所成就。说明大多数人的观点是《乌合之众》,必须有从想到去做到的能力,面子是无能者维护尊严的盾牌。 2、年轻时候一定要大量阅读࿰…...
黑龙江省机场建设集团官网网站/软文客
前言: 搞java开发的时候突然对网络产生了兴趣,兜兜转转最终还是再次学习起了大二时候经常不听课自学的网络原理. 参考视频是慕课网上的 一站式学习Java网络编程 全面理解BIO/NIO/AIO 第二章 与 剑指Java面试-Offer直通车 第二章. 目录 第一章 网络基础知识 1.1 七层网络协议…...
建立网站要准备多少钱/北京seo百度推广
Eureka 服务器架起来了(关于架设步骤参考博客《Linux 下 Eureka 服务器的部署》),现在如何把我们要负载均衡的服务器(也就是从 Application Client 接收请求并返回一个响应的 Application Service)注册到 Eureka?本文以一个示例介绍 Eureka Application …...
wordpress新建全屏页面/怎么做好公司官网推广
变量、常量、命名规范 变量 Java是一种强类型语言,每个变量都必须声明其类型。只有声明变量后才能对变量去分配相应的存储空间。 Java变量是程序中最基本的存储单元,变量包括变量类型、变量名和作用域。变量类型可以是基本类型和引用类型。 局部变量和…...
做网站需要哪些成本/广州白云区疫情实时动态
excel怎么冻结前两行不动?其实只要直接使用冻结窗格功能就可以了。下面我们来学习一下。冻结窗口怎么冻结多行步骤1、打开excel文件,例如这个表格。步骤2、只冻结前两行需要选中第三行,选择【视图】-【冻结窗格】;步骤3、在三角处打开&#…...